我在SQL Server中有此查询,这将给我两个表之间的区别

SELECT * FROM dbo.emp
except
SELECT * FROM #temp1

我只用一条记录就得到了正确的结果(正确)

但是当我使用左外部联接时

SELECT emp.* FROM emp
LEFT JOIN #temp1 ON emp.empid = #temp1.empid 
and
emp.firstname = #temp1.firstname 
AND emp.lastname = #temp1.lastname 
and emp.salary = #temp1.salary
and emp.dob = #temp1.dob
WHERE #temp1.empid IS NULL;

我得到39条记录。 为什么会有所不同? 我在加入条件中提到了所有列。

我知道如何通过where子句执行此操作,但我的目的是了解为什么外部联接不起作用。 基本上我做错了什么

下面的代码有效

SELECT dbo.emp.* FROM dbo.emp
JOIN #temp1 ON emp.empid = #temp1.empid 
where
emp.firstname <> #temp1.firstname 
or emp.lastname <> #temp1.lastname 
or emp.salary <> #temp1.salary
or emp.dob <> #temp1.dob;

===============>>#1 票数:3 已采纳

外连接可能不起作用,因为某些字段具有NULL值。

您可以使用union allgroup by来模拟except

SELECT emp.*
FROM ((select 'emp' as which, empid, firstname, lastname, salary, dob
       from emp
      ) union all
      (select 'temp', empid, firstname, lastname, salary, dob
       from @temp1
      )
     ) t
group by empid, firstname, lastname, salary, dob
having sum(case when which = 'temp' then 1 else 0 end) = 0;

编辑:

您可以使用更复杂的条件通过join执行此操作:

SELECT emp.*
FROM emp LEFT JOIN
     #temp1
     ON (emp.empid = #temp1.empid or coalesce(emp.empid, #temp1.empid) is null) and
        (emp.firstname = #temp1.firstname or coalesce(emp.firstname, #temp1.firstname) is null) and
        (emp.lastname = #temp1.lastname or coalesce(emp.lastname, #temp1.lastname) is null)  and
        (emp.salary = #temp1.salary or coalesce(emp.salary,  #temp1.salary) is null) and
        (emp.dob = #temp1.dob or  or coalesce(emp.dob, #temp1.dob ) is null)
WHERE #temp1.empid IS NULL;

  ask by Navyseal translate from so

未解决问题?本站智能推荐:

1回复

如何使用存储在数据库中的比较运算符比较两个表中的数据?

我正在寻找一种方法来构建一个脚本来比较来自两个不同表的数据,使用存储在数据库中的比较运算符。 我通过两种方式实现了解决方案: 使用动态SQL 使用案例陈述 但我想解决使用不包括动态SQL或case语句的问题。 这是我的基础数据表: 这是我的比较数据表
1回复

在没有PIVOT运算符的情况下执行数据透视

我在设计程序时遇到困难,该程序将在稍后讨论的表上使用给定的汇总执行数据透视。 过程应该使用传递到过程中的聚合动态地从Sales.Month和数据透视表中获取所有条目,例如,如果我们要在Sales上传递SUM(使用VARCHAR传递,然后在动态创建的查询上传递EXEC): 销售:
4回复

在具有空值的列中的两个字符'('和')'之间查找值

我有一个表名作者。 我需要在其名称的末尾提取值,但不包括'('和')'。 我尝试将子字符串与Charindex函数一起使用。 但是我收到一条错误消息。 消息537,第16级,州3,第6行 无效的长度参数传递给LEFT或SUBSTRING函数。 这就
1回复

SQL Server具有相同列但具有空值的两个表

我在下面的示例数据中有两个具有相同结构的临时表,但是我需要获得一个表输出,并在两个表之间采用最佳值(此处的最佳值是NO NULL)。 忽略两个表中两个相同列之间的空值。 表格1 表2 输出值
2回复

比较两个数据库中的文章,仅在以下情况下删除

我有一个数据库表,将其称为“ t1”,另一个表将其称为“ t2” 如果不在t2中,我想将某些内容插入t1中。 知道它是否已经在t2中的条件(又称其为DUPLICATE)是t2中一个条目中字段之一的文本是否已经存在(与要插入的文本完全匹配) 如何使用SQL Server制定此条件?
2回复

SQL'NOT IN'运算符在比较两个表中的列时不会给出预期的结果

我需要从临时表更新表。 因此,我需要比较并找出要从临时表导入的主表中没有的行。 我的表看起来如下, 两个表都有相同的字段,但临时表有更多的最新记录要带到主表。 我在用; 但条件WHERE t.line_id NOT IN (SELECT line_id FROM main_
4回复

SQL“或”运算符。 在以下情况下如何工作?

我一直在优化查询,并且遇到了一种情况,使我怀疑如何一直使用SQL的OR运算符。 (同样是SQL Server 2000) 我有一个条件(WHERE)子句看起来像这样的查询: 现在,我一直了解SQL中的OR会对两个表达式求值。 因此,将返回所有对左侧表达式为true的记录以及对右
1回复

抑制数据透视表中具有空值的列

大家好,以下查询基本上将3个表合并到数据透视表中,以显示StaffReference Code,StaffCode作为标头以及两者之间的WipAmount。 这段代码基本上可以正确运行,但是我想禁止所有字段为NULL的列。 这将使阅读报告更加容易 当前输出是什么的示例 我需要的
2回复

在两个表上联接-在没有匹配记录的情况下显示数据

我有两个要连接的表...。表的结构如下所示... 所以我试图在NoClient和ApptDate上加入这两个表。 我的目标是查看tbl1所有记录tbl2没有匹配的记录( ApptDate和Noclient ) 在这种情况下所需的最终结果 NoClient = 3555
3回复

SQL Server中两个表之间的数据比较

我有一个要求,其中我有两个表tbl_bb和tbl_rr并且其中有数据,如下所示: tbl_bb : tbl_rr : 现在的要求是我要挑从tbl_bb和环通基于ISIN和代理和循环条件的加盟tbl_rr数据的每一个记录是从tbl_bb考虑日期和检查每个日期 tbl_rr ,