1

これは私の既存のSQLクエリの構造です:

SELECT * FROM (

    SELECT *, 'A' AS Status FROM Table1
    WHERE Field1 NOT IN 
    (
    SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
    )

    UNION

    SELECT *, 'B' AS Status FROM Table1
    WHERE Field1 IN 
    (
    SELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...
    )

) AS Result

ここでは、テーブルから 2 セットのデータを選択し、列に2 つの異なる値(A と B) を割り当てStatus、両方のユニオンを結果として 1 つに設定しています。

この方法の問題点は、内部選択クエリを複製する必要があることですSELECT Field1 FROM Table2 WHERE Field 1 = 'val' AND ...(私の元の SQL クエリは上記よりも少し複雑です)

これを単一の Select クエリとして書き直すにはどうすればよいですか? それは可能ですか?

4

4 に答える 4

2

次のように、WHERE 条件を CASE 式に移動するだけです。

SELECT
  *,
  CASE 
    WHEN Field1 IN (
      SELECT Field1 FROM Table2 WHERE Field1 = 'val' AND ...
    )
    THEN 'B'
    ELSE 'A'
  END AS Status
FROM Table1
;

他の人が提案したように LEFT JOIN メソッドを使用することもできますがTable2、指定されたフィルターの重複を生成すると、出力にも重複が発生する可能性があります。これを避けるには、おそらく次のような個別の値のみを返す派生テーブルを使用する必要があります。

SELECT
  t1.*,
  CASE 
    WHEN t2.Field1 IS NULL THEN 'A'
    ELSE 'B'
  END AS Status
FROM Table1 t1
LEFT JOIN (
  SELECT DISTINCT Field1 FROM Table2 WHERE Field1 = 'val' AND ...
) t2
  ON t1.Field1 = t2.Field2
;
于 2013-01-16T09:58:29.560 に答える
0
于 2013-01-16T04:03:33.430 に答える
0

LEFT JOINこれで簡単に使用できます

SELECT  a.*,
        CASE WHEN b.field1 IS NULL
            THEN 'A'
            ELSE 'B'
        END AS Status
FROM    table1 a
        LEFT JOIN table2 b
            ON a.field1 = b.field1 AND
                b.field1 = 'VAL'
于 2013-01-16T03:54:50.070 に答える
0

U は、次のようLEFT JOINに andCASEを使用してこれを達成できます

SELECT  a.*,
    (CASE b.Field1
           WHEN 'Val' 
           THEN 'B' ELSE 'A' END) as status
FROM  Table1 a LEFT JOIN Table2 b ON a.field1 =b.field1 

ステータスに複数の条件がある場合は、次の条件を試してください

SELECT  a.*,
    (CASE 
           WHEN (SELECT COUNT(Field1) 
                 FROM Table2 
                 WHERE field1 =a.field1 AND Field 1 ='val' AND ...) >0
           THEN 'B' ELSE 'A' END) as status
FROM  Table1 a LEFT JOIN Table2 b ON a.field1 =b.field1 
于 2013-01-16T05:35:35.630 に答える