【问题标题】:Show all and only rows in table 1 not in table 2 (using multiple columns)仅显示表 1 中的所有行,而不是表 2 中的行(使用多列)
【发布时间】:2019-04-18 17:59:17
【问题描述】:

我有一个表(Table1),它有几列组合使用:Name、TestName、DevName、Dept。当这 4 列中的每一列都有值时,记录被插入到 Table2 中。我需要确认表 1 中每个字段中具有现有值的所有记录都已正确复制到表 2 中。

我已经为它创建了一个查询:

SELECT DISTINCT wr.Name,wr.TestName, wr.DEVName ,wr.Dept
FROM table2 wr
where NOT EXISTS (
SELECT NULL
FROM TABLE1 ym
WHERE ym.Name = wr.Name 
          AND ym.TestName = wr. TestName
          AND ym.DEVName = wr.DEVName 
          AND ym. Dept = wr. Dept 
          )

我的计数没有加起来,所以我认为这是不正确的。您能否建议我根据我的需要编写此查询的最佳方式?

【问题讨论】:

  • 将 'SELECT NULL' 替换为 'SELECT 1' 工作吗?
  • “Table2 中不在 Table1 中的所有行”不是您的查询正在执行的操作。您的查询正在获取 Table1 中所有不在 Table2 中的行。
  • 抱歉,Eric,我写错了问题。我运行正确,所以更正了问题
  • Renat - 我还不够熟悉,所以必须测试一下。我会告诉你的,我现在正在做。谢谢!
  • 我得到与 NULL 相同的计数 1

标签: sql-server


【解决方案1】:

如果表定义相同,您可以为此使用EXCEPT 集合运算符。

SELECT DISTINCT ym.Name, ym.TestName, ym.DEVName, ym.Dept
FROM table1 ym
EXCEPT
SELECT DISTINCT wr.Name, wr.TestName, wr.DEVName, wr.Dept
FROM table2 wr

这会从第一个表返回不同的行,其中第二个表中没有匹配项。在此处阅读有关EXCEPTINTERSECT 的更多信息:https://docs.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql?view=sql-server-2017

【讨论】:

    【解决方案2】:

    您的查询应该可以完成这项工作。它检查Table1 中的所有内容,但不检查Table2

    SELECT ym.Name, ym.TestName, ym.DEVName, ym.Dept
    FROM Table1 ym
    WHERE NOT EXISTS (
        SELECT 1
        FROM table2
        WHERE ym.Name = Name AND ym.TestName = TestName AND ym.DEVName = DEVName AND ym. Dept = Dept 
    )
    

    如果两个表的结构相同,EXCEPT 可能更简单。

    【讨论】:

      【解决方案3】:
      IF OBJECT_ID(N'tempdb..#table1') IS NOT NULL drop table #table1
      IF OBJECT_ID(N'tempdb..#table2') IS NOT NULL drop table #table2
      
      create table #table1 (id int, value varchar(10))
      create table #table2 (id int)
      
      insert into #table1(id, value) VALUES (1,'value1'), (2,'value2'), (3,'value3')
      --test here. Comment next line
      insert into #table2(id) VALUES (1) --Comment/Uncomment
      
      select * from #table1
      select * from #table2
      
      
      select #table1.* 
      from #table1 
      left JOIN #table2 on 
          #table1.id = #table2.id
      where (#table2.id is not null or not exists (select * from #table2))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 2020-07-19
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        相关资源
        最近更新 更多