2016-04-13 24 views
0

重複した列名の使用テーブル:次の2つの同一の列gbdがあることがわかりますSQL Serverの:私はこのようなSQLクエリに副選択を作成しようとしています

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')); 

。ただし、このクエリは正常に実行されます。しかし、私は以下のような副選択として、このクエリを使用しようとすると、それは誤り#8156を返し、失敗します。

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); 

私は何の意味が二度同じ列を選択するには、実際には存在しないことを知っているが、私は変更することはできません。私はデータベースからそれを読んでいるので、内部のSQLクエリ。

このクエリの目的は、結果を特定の範囲で取得することです。

私の質問は、SELECTステートメントを変更せずにこのクエリを動作させるにはどうすればいいですか?これはまた、列についてわからないことを意味するので、*を特定の列名に変更することはできません。

+0

をしかし、なぜあなたは明示的に二度同じ列を選択しますか? – jarlh

+0

私はSQLクエリーとしてデータベースから読み込み中です。つまり、重複した列を持つ内部SQLクエリはすでに存在しています。 – Eddi

+0

誰かがやったことのある人は、時にはそれを修正するか、それを修正する必要があるだけで、後ろに曲がる代わりに、後で回避する必要があります。 –

答えて

2

別名を付ける必要があります。それはサブクエリの要件を満たしていないので、あなたは、クエリがサブクエリとして仕事を得ることができない、言い換えれば

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); 

:サブクエリは、同じ名前を持つ2つの列を持つことはできません。

+0

私はできません列にエイリアスを付けると、私の要件を満たす別の方法がありますか? – Eddi

+1

@Eddiエイリアスを割り当てられないのはなぜですか? –

1

サブクエリに重複する名前があります。あなたが他の人によって示唆されているように別名を割り当てるために、データベースからそれを読んだ後にあなたがサブクエリを変更することができ

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するaliasを使用しています。 それともあなたはサブクエリが常に同じ順序で列の同じセットを持っていることを頼ることができるかどうかサブクエリを変更せずにこれを試すことができます。

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); 
関連する問題