2012-05-02 7 views
2

次の2つのSELECTステートメントの違いは、視覚的にわかっています。join句の条件とwhere句の相違点

SELECT P.* and X.* 
FROM Table1 P 
LEFT OUTER JOIN 
    Table2 X ON 
    and p.B=x.B 
and p.C=x.C 
and p.F=x.F 
and p.D=x.D 

WHERE X.F= 1 and X.E=4 

SELECT P.* and X.* 
FROM Table1 P 
LEFT OUTER JOIN 
    (SELECT * FROM Table2 WHERE X.F= 1 and X.E =4) X 
    and p.B=x.B 
and p.C=x.C 
and p.F=x.F 
and p.D=x.D 

彼らは、同じ数の行を返しません。 Table1には5000行、Table2には5000行があるとします。最初のselect join文は〜40000行(仕事中のクエリに固有)を返し、その後where句が適用されると約2000行を返します。

第2のselect joinステートメントは5000行(元の数)を返します。これは私が望む番号です。

しかし、なぜこれが起こっているのか分かりません。私の知識とvisuallizing結合は少し弱いです。

サンプルデータ:テンポラリテーブルの名前を変更してください。同じです。 ------------ :ここでは表2

SELECT * INTO #tmp_GridResults_1 
FROM (
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'1' AS [E], N'2' AS [F]) t; 
SELECT [ID], [B], [C], [D], [E], [F] 
FROM #tmp_GridResults_1 

DROP TABLE #tmp_GridResults_1 
GO 

されています。また、私は、適切な列名を提供しませんでしたが、私はここで に合わせたいcolumsnを示すために、自分のコードを編集したTABLE1です---#tmp_GridResults_1 ---------------

SELECT * INTO #tmp_GridResults_1 
FROM (
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'0' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'0' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'0' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'0' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'0' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'0' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'0' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'0' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'1' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'1' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'2' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'2' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'2' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'2' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'2' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'2' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'2' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'2' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'2' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'2' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'2' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'2' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'3' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'3' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'3' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'3' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'3' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'3' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'3' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'3' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'3' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'3' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'3' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'3' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'4' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'4' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'4' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'4' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'4' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'4' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'4' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'4' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'4' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'4' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'4' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'4' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'98' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'98' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'-1' AS [D], N'98' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'-1' AS [D], N'98' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'98' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'98' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'0' AS [D], N'98' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'0' AS [D], N'98' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'98' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'98' AS [E], N'1' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'1' AS [C], N'1' AS [D], N'98' AS [E], N'2' AS [F] UNION ALL 
SELECT N'0' AS [ID], N'P' AS [B], N'2' AS [C], N'1' AS [D], N'98' AS [E], N'2' AS [F]) t; 
SELECT [ID], [B], [C], [D], [E], [F] 
FROM #tmp_GridResults_1 

DROP TABLE #tmp_GridResults_1 
GO 

答えて

1

あなたはWHERE句でフィルタ条件を入れ、その基準はの「外側」のテーブルに対して条件を規定した場合その外部結合を効果的に内部結合に変換します。外部結合テーブルに対するフィルタ条件は、結合ではなく、場所に属します。

このバージョンでは、いくつの行が生成されますか?

SELECT P.*, X.* 
FROM Table1 P 
LEFT OUTER JOIN Table2 X 
    on P.Id = X.id 
    and P.name = X.name 
    and P.age = X.age 
    AND X.bar = 1 
    and X.name ='value'; 

理論的には、これは> =最初のステートメントの行数と= 2番目のステートメントの行数です。

既存の結果とこれを比較したい場合は、あなたが行うことができます:

SELECT P.*, X.* 
FROM Table1 P 
LEFT OUTER JOIN Table2 X 
    on P.Id = X.id 
    and P.name = X.name 
    and P.age = X.age 
    AND X.bar = 1 
    and X.name ='value' 
EXCEPT 
SELECT P.* and X.* 
FROM Table1 P 
LEFT OUTER JOIN 
    (SELECT * FROM Table2 WHERE X.bar = 1 and X.name ='value') X 
    on P.Id = X.id 
    and P.name = X.name 
    and P.age = X.age; 

あなたは何の結果を得ていない場合、それらは同じです。あなたはまた、それを逆方向に行うことができます:あなたは5000行を取得する場合

SELECT P.*, X.* 
FROM Table1 P 
LEFT OUTER JOIN Table2 X 
    on P.Id = X.id 
    and P.name = X.name 
    and P.age = X.age 
    AND X.bar = 1 
    and X.name ='value' 
INTERSECT 
SELECT P.* and X.* 
FROM Table1 P 
LEFT OUTER JOIN 
    (SELECT * FROM Table2 WHERE X.bar = 1 and X.name ='value') X 
    on P.Id = X.id 
    and P.name = X.name 
    and P.age = X.age; 

を(あるいは、正確な行数は、それ自体で、後者のクエリのためには何でも)、その後、結果セットは同じです。

+0

trueですが、where節がなくても、彼は5000行ではなく4000行になると言います。 –

+0

私は最初のselect文から約4000行を取得します。私は条件をジョインに置くとうまくいきます。 – masfenix

+0

この場合の外部表は 'TableB'権利ですか? – masfenix