4

FULL OUTER JOIN に値条件を追加する必要があります。

つまり、私はこれをしようとしています:

SELECT *
FROM Table1
FULL OUTER JOIN Table2 ON Table1.Field1 = Table2.Field1 AND Table2.Field2 > 5

しかし、このスクリプトは機能しません。実際には、条件 (Table2.Field2 > 5) はまったく適用されていないようです。

RIGHT OUTER JOINでも同様の問題が発生するので、RIGHTまたはFULL結合の場合、結合で右側のテーブルに無値条件が適用されることが原因だと思います。
なぜこうなった?そのような行動の概念的な説明はありますか?

もちろん、主な問題は、この問題をどのように解決するかです。

サブクエリを使用せずにこれを解決する方法はありますか?

SELECT *
FROM Table1
FULL OUTER JOIN (SELECT * FROM Table2 WHERE Table2.Field2 > 5) AS t2 ON Table1.Field1 = t2.Field1
4

3 に答える 3

3

あなたが望むものは次のように再定式化されるかもしれません:

 SELECT *
   FROM Table1
   LEFT JOIN Table2 ON Table1.Field1 = Table2.Field1 AND Table2.Field2 > 5
  UNION ALL
 SELECT *
   FROM Table1
  RIGHT JOIN Table2 ON Table1.Field1 = Table2.Field1
  WHERE Table2.Field2 > 5
    AND Table1.Field1 IS NULL

しかし、自分で提案したようにサブクエリを使用するのがIMOの最良の選択肢です。

于 2012-01-18T09:06:50.097 に答える
2

これは私を混乱させていました。今、私はそれを手に入れました!"on" の後の条件 (あなたの場合: Table1.Field1 = Table2.Field1 AND Table2.Field2 > 5 ) は、2 つのテーブルのどの行が結合されているかを結合演算子に伝えます。これは、table1 の row1 とテーブルの row2 が、row1.field1 = row2.field2 と row2.field2 > 5 の両方を満たす場合にのみ、row1 と row2 が結合されることを意味します。残りの行は結合されません。

したがって、完全外部結合では、結果セットは、結合された行、table1 からの結合されていない行、および table2 からの結合されていない行になります。右結合では、結果セットは結合された行、table2 からの結合されていない行になります。いずれの場合も、field2 <= 5 のテーブル 2 の行は、テーブル 2 の結合されていない行の結果セットに含まれます。

これが、「Table2.Field2 > 5」が左結合では適切に機能しているが、右結合または完全結合では「適切に」機能していない理由ですが、値の条件は正しく機能しています。

于 2016-05-30T04:06:28.857 に答える
1

かなり複雑ですが、サブクエリはありません

SELECT  Table1.*
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field1 ELSE NULL END
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field2 ELSE NULL END        
FROM    Table1
        FULL OUTER JOIN Table2 ON Table1.Field1 = Table2.Field1
WHERE   COALESCE(Table2.Field2, 6) > 5
        OR Table1.Field1 = Table2.Field1

テストスクリプト

;WITH Table1 AS (
  SELECT * FROM (VALUES
    (1, 1)
    , (2, 2)
    , (5, 5)
    , (6, 6)
  ) AS Table1 (Field1, Field2)
)
, Table2 AS (
  SELECT * FROM (VALUES
    (1, 1)
    , (3, 3)
    , (4, 4)
    , (5, 5)
    , (7, 7)
  ) AS Table2 (Field1, Field2)
)
SELECT  Table1.*
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field1 ELSE NULL END
        , CASE WHEN Table2.Field2 > 5 THEN Table2.Field2 ELSE NULL END        
FROM    Table1
        FULL OUTER JOIN Table2 ON Table1.Field1 = Table2.Field1
WHERE   COALESCE(Table2.Field2, 6) > 5
        OR Table1.Field1 = Table2.Field1

結果

 Field1 Field2 Field1 Field2
 1      1      NULL   NULL
 5      5      NULL   NULL
 NULL   NULL   7      7
 6      6      NULL   NULL
 1      1      NULL   NULL
 2      2      NULL   NULL
于 2012-01-18T09:59:44.263 に答える