【问题标题】:How to return rows that do not yet exist in another table without common ID如何在没有公共 ID 的情况下返回另一个表中尚不存在的行
【发布时间】:2021-11-05 17:24:02
【问题描述】:

我是 SQL 新手,请多多包涵。

我有 2 张桌子:

表1:

Col1    Col2     ColXX    ColYY     IsDisplay
---------------------------------------------
NULL      AA        NULL     AA         1
BBB       CCC       QQ       QQ         1
DDD       EEE       QQ       QQ         1
1F        2G        WW       WW         0
1H        1H        SS      NULL        1

表2:

ID      Col1     Col2    Sold    Total    TotalPax
-------------------------------------------------------
1       BBB       CCC     10       10       1
1       DDD       EEE     10       10       1
1       1H        1H      5        50       10
1       NULL      AA      5        50       10

如您所见,在 2 个表中,唯一常见的列是 Col1 和 Col2。鉴于此。

我需要获取 table1 中 ColXX 和 ColYY 的唯一数据,这些数据在 table2 中不存在。对于这种情况:

     ColXX    ColYY   
    ----------------
     QQ       QQ    
     WW       WW
     SS       NULL

我不知道该怎么做。有人可以帮助我吗?谢谢

样本数据: http://sqlfiddle.com/#!18/92640/15

【问题讨论】:

  • 您能解释一下为什么QQ QQSS NULL 在预期结果中吗?
  • 嗨。 :) 这是因为 QQ , WW, SS 不在 table2 中
  • 所以你的标准是 Table1 ColXXColYY 中的值在 Table2 Col1Col2 中不存在?
  • 你试过用EXISTS
  • 到目前为止,我已经尝试过:SELECT * FROM Table1 t1 WHERE NOT EXISTS(SELECT Col1,Col2 FROM table2);但它返回 0 行

标签: sql sql-server tsql


【解决方案1】:

使用LEFT JOINIS NULL

SELECT *
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.col1 = t2.col1 AND t1.col2 = t2.col2
WHERE t2.id IS NULL

仔细查看你的数据和你的例子,我认为你需要这个:

SELECT DISTINCT ColXX, ColYY
FROM table1 t1
LEFT JOIN table2 t2 ON 
  ISNULL(t1.ColXX, '') = ISNULL(t2.Col1, '') 
  AND ISNULL(t1.ColYY, '') = ISNULL(t2.Col2, '')
WHERE ISNULL(t2.ID, '')=''

【讨论】:

  • 感谢您的帮助,但似乎在 sqlfiddle 中运行查询时它只返回 WW 行。 sqlfiddle.com/#!18/92640/1
  • 因为在你的小提琴中你使用了空字符串而不是 NULLs
  • @mtwstark - NULL vs '' 不是原因。它的操作想加入 colXX 和 colYY,但问题并没有说得很清楚。
  • @MatBailie 是的 :) 在仔细查看所需的输出后我明白了
【解决方案2】:
SELECT
  *
FROM
  table1   AS t1
WHERE
  NOT EXISTS (
    SELECT *
      FROM table2   AS t2
     WHERE (t2.Col1 = t1.ColXX OR (t2.Col1 IS NULL AND t1.ColXX IS NULL)) 
       AND (t2.Col2 = t1.ColYY OR (t2.Col2 IS NULL AND t1.ColYY IS NULL)) 
  )

注意,您的小提琴/示例有 Co11 而不是 Col1

演示:http://sqlfiddle.com/#!18/92640/12

【讨论】:

  • 嗨。谢谢,它有效。我更新了问题中的示例 sqlfidlle。 :)
  • @Amelia 但是你明白它为什么有效吗?关联子查询是任何 SQL 版本的基本技能。
  • 旁注:你见过this syntax比较空值吗?
猜你喜欢
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
相关资源
最近更新 更多