2011-08-24 30 views
6

作成したいビューに問題があります。私は左の外側の結合で結合された2つのテーブル、例えばtableAtableBを持っています。ここではtableBが外側に結合されています。左の外部結合のSQL where節

テーブルBの状態が4の行だけを選択したいので、クエリにWHERE state = 4を追加します。 tableBに一致する行のないすべての行が結果から削除されるため(結果は状態が4ではないため)、結果セットはかなりトリミングされます。私もWHERE state = 4 OR state IS NULLを試しましたが、どちらも動作しません(stateは技術的には状態がない場合はNULLではありません)。

私が必要とするのは、実際に行がある場合にのみ評価されるWHEREステートメントです。そのようなことはありますか?

テーブルBの代わりにjoin (SELECT * FROM tableB WHERE state = 4)という2つのオプションがあります。または、同じWHEREステートメントでビューを作成して、代わりにそのビューに参加してください。パフォーマンスの最適なオプションは何ですか?

これは、ところでSQL Server 2008 R2です。

+1

それは左のを防ぐ必要があるため 'WHERE状態= 4または状態がNULL'が動作しない理由を仕事にしようとする興味深いものになるだろうが、内側に変換された結合します参加する。 –

+0

@Damien_The_Unbeliever - これは、TableBのTableAではなくTableAのTableBに一致する行がないTableAからすべての行を取得します。状態<> 4. http://data.stackexchange.com/stackoverflow/qt/110316/ –

+0

@ Damien_The_Unbeliever:3つの状態があります:状態= 4と一致、状態<> 4と一致、一致なし – gbn

答えて

6

条件をon節に入れます。例:

select a.this, b.that 
from TableA a 
left join TableB b on b.id = a.id and b.State = 4 
+0

ああ、私はそれを知らなかった!ありがとう! – Jasper

4

state = 4を結合条件に追加できます。

select * 
from T1 
    left outer join T2 
    on T1.T1ID = T2.T1ID and 
     T2.state = 4 
1

on句、などを拡大しているサブクエリよりも簡単。 、TableAのから

select * 
from TableA a 
left join 
     TableB b 
on  a.b_id = b.id 
     and b.state = 4 

すべての行が表示され、のみテーブルBから状態4.

SQL Serverは、おそらくビューを実行しますまったく同じ方法でon、およびサブクエリを拡大しました。パフォーマンスが賢明なので、ほとんど違いはありません。

0

代替アプローチ:(1)内側の結果(3)組合、存在しない行を見つけるために、テーブルBに(2)アンチ結合、状態が4に等しいテーブルBに参加:

SELECT A1.ID, A1.colA, B1.ColB 
    FROM tableA AS A1 
     INNER JOIN tableB AS B1 
      ON A1.ID = B1.ID 
      AND B1.state = 4 
UNION 
SELECT A1.ID, A1.colA, '{{MISSING}}' AS ColB 
    FROM tableA AS A1 
WHERE NOT EXISTS (
        SELECT * 
        FROM tableB AS B1 
        WHERE A1.ID = B1.ID 
       ); 

代わり:

SELECT A1.ID, A1.colA, B1.ColB 
    FROM tableA AS A1 
     JOIN tableB AS B1 
      ON A1.ID = B1.ID 
      AND B1.state = 4 
UNION 
SELECT ID, colA, '{{NA}}' AS ColB 
    FROM tableA 
WHERE ID IN (
       SELECT ID 
       FROM tableA 
       EXCEPT 
       SELECT ID 
       FROM tableB 
      ); 
関連する問題