1

次の 2 つの SQL Server テーブルがあるとします。

t1:

|----------------------------------------------|
|name | day_planed | day_canceled | discription|
|----------------------------------------------|
|alpha| 2015-11-02 | 2015-11-01   | some       |
|alpha| 2015-11-02 | 2015-10-30   | text       |
|beta | 2015-11-02 | 2015-11-01   | here       |
|----------------------------------------------|

t2:

|----------------------------------------------|
|name | day_planed | day_canceled | discription|
|----------------------------------------------|
|alpha| 2015-11-02 | 2015-10-30   | text       |
|----------------------------------------------|

t1 のクエリでは、t2 以外のすべてのエントリが必要です。私はすでに似たようなことを試しました

SELECT * 
FROM t1 AS A 
LEFT JOIN t2 as B ON (A.name = B.name 
                  AND A.day_planed = B.day_planed 
                  AND A.day_canceled != B.day_canceled)

残念ながら、t1のクエリでt2から行を除外しない理由がわかりません。

2 番目の質問は、最大の説明を含む行を返すだけで、t2 なしで t1 のクエリを作成する簡単な方法が実際にある場合です。SQL Serverで調べてみましたが、最初の識別子しか見つかりませんでした。これは、SQLのこの「素晴らしい」実装では機能しません...

4

2 に答える 2

2

where句と説明の条件が欠落しています。また、!= を = に変更する必要があります。

SELECT * 
FROM t1 AS A 
LEFT JOIN t2 as B ON (A.name = B.name 
              AND A.day_planed = B.day_planed 
              AND A.day_canceled = B.day_canceled
              AND A.discription = B.discription)
WHERE B.Name IS NULL
于 2015-11-15T13:02:55.803 に答える
2

この「素晴らしい」実装でそれを行う方法はいくつかあります。

SELECT * FROM t1
EXCEPT
SELECT * FROM t2

1であります。もう一つは:

SELECT * 
FROM t1
WHERE NOT EXISTS
    ( SELECT *
      FROM t2
      WHERE t2.name = t1.name
      AND t2.day_planed = t1.day_planed
      AND t2.day_canceled = t1.day_canceled
  )

または、ON 句の後にLEFT JOIN一致しなかった行を使用してチェックすることもできます。WHERE t2.name IS NULLあなたが持っているものと同じですが、 != の代わりに = を使用します

SELECT t1.* 
FROM t1
LEFT JOIN t2
      ON t2.name = t1.name
      AND t2.day_planed = t1.day_planed
      AND t2.day_canceled = t1.day_canceled
WHERE t2.name IS NULL;

すべての列 ( を含む) をチェックする場合はdiscription、EXCEPT を使用します。

于 2015-11-15T12:17:10.177 に答える