2016-04-13 28 views
0

yinelenen sütunlar adları ile kullanım tablosu: İki özdeş sütun gbd olduğunu görebilirsinizSQL Server: Böyle bir SQL sorgusu üzerinde subselect oluşturmaya çalışıyorum

SELECT 
    t0.id, t0.gad, t0.gbd, t0.mandant, t0.gbd, t1.year 
FROM 
    person t0 
LEFT OUTER JOIN 
    control t1 ON (t0.id = t1.id) 
WHERE 
    ((t0.id = '1') or (t0.id = '2')); 

. Ancak, bu sorgu başarıyla çalışır. Ben aşağıdaki gibi bir subselect olarak bu sorguyu kullanmaya çalıştığınızda Ancak, hata #8156 dönen, başarısız: Ben iki kez aynı sütun seçiminde hiçbir anlamı aslında olduğunu biliyoruz

SELECT * 
FROM 
    (SELECT 
     t0.id, t0.gad, t0.gbd, t0.mandant, t0.gbd, t1.year 
    FROM 
     person t0 
    LEFT OUTER JOIN 
     control t1 ON (t0.id = t1.id) 
    WHERE ((t0.id = '1') or (t0.id = '2'))) result 
WHERE 
    (result.gad >= 0) and (result.gbd <= 99); 

ama değiştiremezsiniz İç SQL sorgusu çünkü bir veritabanından okudum.

Bu sorgunun amacı, belirli bir aralıktaki sonuçları almaktır.

Benim sorum şu ki, bu sorguyu iç SELECT ifadesini değiştirmeden nasıl çalıştırabilirim? Bu ayrıca sütunları bilmediğim anlamına gelir, bu yüzden * özel sütun adlarını değiştiremiyorum.

+0

Ama neden açıkça iki kez aynı sütunu seçilir? – jarlh

+0

SQL Query gitmeye hazır olarak bir veritabanından okuyorum. Yani iç SQL Query - yinelenen sütunlarla - zaten var. – Eddi

+0

Birisi bir bok işi yaptıysa, bazen bunu düzeltmeniz veya daha iyi bir şekilde düzeltmeniz gerekir, tersine çalışmak için geriye doğru eğmek yerine ... –

cevap

2

Bir takma ad vermeniz gerekiyor. Bir alt sorgu gereksinimlerini karşılamadığı için size, sorgu alt sorgu olarak çalışmaya alamayan Başka bir deyişle,

SELECT * 
FROM (SELECT t0.id, t0.gad, t0.gbd as gbd, t0.mandant, t0.gbd as gbd1, t1.year 
     FROM person t0 LEFT OUTER JOIN control t1 ON (t0.id = t1.id) 
     WHERE ((t0.id='1') or (t0.id='2')) 
    ) result 
WHERE (result.gad >= 0) and (result.gbd <= 99); 

: Bir alt sorgu aynı ada sahip iki sütun olamaz.

+0

sütunları bir takma ad verin, gereksinimlerimi karşılamanın başka bir yolu var mı? – Eddi

+1

@Eddi Neden takma adlar atayamıyorsunuz? –

1

Alt Sorgunuzda yinelenen ad var. Başkaları tarafından önerildiği gibi adlar atamak için veritabanından okudum sonra alt sorgu değiştirebilirsiniz

SELECT * FROM 
(
    SELECT t0.id, t0.gad, t0.gbd, t0.mandant, t0.gbd Tmp, t1.year 
    FROM person t0 LEFT OUTER JOIN control t1 ON (t0.id = t1.id) 
    WHERE ((t0.id='1') or (t0.id='2')) 
) result 
WHERE (result.gad >= 0) and (result.gbd <= 99); 
0

differenciate için alias kullanın. Ya da alt sorgu her zaman aynı sırayla aynı kolon setine sahip olacağı güvenebilirsiniz eğer alt sorgu değiştirmeden bu deneyebilirsiniz:

SELECT * 
FROM 
    (SELECT 
     t0.id, t0.gad, t0.gbd, t0.mandant, t0.gbd, t1.year 
    FROM 
     person t0 
    LEFT OUTER JOIN 
     control t1 ON (t0.id = t1.id) 
    WHERE ((t0.id = '1') or (t0.id = '2'))) result (id, gad, gbd1, mandant, gbd2, year) 
WHERE 
    (result.gad >= 0) and (result.gbd1 <= 99);