2017-09-29 9 views
-1

コードのこの作業作品を検討してください:これはどこの部分では、クエリの一部である、と私はまた、DTも中に存在している、テーブルは、Ptことを言及すべきであることをSQLサブクエリの範囲

exists 
         (
          select 1 from dt dt1 inner join pt pt1 on dt1.map=pt1.map and dt1.pda=pt1.pda where c.code=dt1.customer and dt1.canceled=0 and dt1.doccode in ('02','03') and pt1.exp_value<>0 
           and dt1.insdate>='20151001' 
           and pt1.item in (select item from f_itemset where itemset='campaign78' and cat_custom='complexion_sccf') 
         ) 
         and not exists 
         (
          select 1 from dt dt2 inner join pt pt2 on dt2.map=pt2.map and dt2.pda=pt2.pda where c.code=dt2.customer and dt2.canceled=0 and dt2.doccode in ('02','03') and pt2.exp_value<>0 
           and dt2.insdate>='20151001' 
           and pt2.item not in (select item from f_itemset where itemset='campaign78' and cat_custom='complexion_sccf') 
         ) 

注意をfrom句。問題は次のとおりです。これらのエイリアス(dt1、dt2など)はすべて必要ですか?これらのエイリアスを与えなければ、外側のクエリとdt/ptの相関関係になる恐れがあるので、私はあまりにもパラノイドになりますか?あなたがサブクエリは最初の1 ...

Normalyからのデータを使用して、SQL Serverはその場合は、警告されますことがわかります

SELECT * FROM TAGS AS T 
WHERE T.[COUNT]< 10 
AND T.ID IN (SELECT O.ID FROM TAGS AS O WHERE O.[COUNT]=9 OR O.ID = T.ID) 

:完璧に動作します。この(愚かな)クエリで

+0

これらの2つのサブクエリは互いに認識しません。 – jarlh

+0

良いですが、エイリアスが存在しなかった場合はどうなりますか? –

+0

いいえ、テーブルのエイリアスまたは違いはありません。 – jarlh

答えて

0

ルック使用する魔法使いのテーブルを決めることができ、エイリアスを設定することができます...しかし、エイリアスを常に置くべきです。

したがって、エイリアスpt1とpt2はクエリ内に保持する必要があります。

+0

待ってください。あなたが外部タグTを呼び出し、サブクエリの中でTと呼んだので、これが起こることを理解しています。問題は、外部タグに別名Tを指定せず、内部タグに別名Oを指定しなかった場合、サブクエリは2つのタグテーブルを相互に関連付けるか、言語のように外側のものをオーバーライドするサブクエリ固有のスコープを作成するか関数のようなCのように、例えば? –

+0

エイリアスなし:WHERE [COUNT] = 9 OR ID = ID SQL Serverはseconde IDを既定のSELECTテーブルと見なします。意味1 = 1 ... – clementakis

+0

...しかし、カウントはサブクエリのタグのものでしょうか? –