如何从SQL Server中的查询中排除另一个表?

如何从SQL Server中的查询中排除另一个表?,sql,sql-server,multiple-entries,Sql,Sql Server,Multiple Entries,假设您有以下两个SQL Server表: t1: t2: 在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) 不幸的是,我不明白为什么在t

假设您有以下两个SQL Server表:

t1:

t2:

在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中排除该行


第二个问题是,是否有一种简单的方法可以通过返回具有最大描述的行来查询t1而不查询t2。我试着在SQL Server中查找它,但只能找到第一个标识符,这对SQL的“奇妙”实现不起作用。

在这个“奇妙”实现中有几种方法可以做到这一点

SELECT * FROM t1
EXCEPT
SELECT * FROM t2
这是一个。另一个是:

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
  )
或者,您可以使用
左JOIN
并在ON子句后检查与
不匹配的行,其中t2.name为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;

如果您想检查每一列(包括
说明
),请使用EXCEPT。

在这个“美妙”的实现中,有几种方法可以做到这一点

SELECT * FROM t1
EXCEPT
SELECT * FROM t2
这是一个。另一个是:

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
  )
或者,您可以使用
左JOIN
并在ON子句后检查与
不匹配的行,其中t2.name为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;

如果要检查每一列(包括
description
),请选择Exception。

您只是缺少where子句和description条件。你也需要改变!=至=

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

您只是缺少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

您的示例代码并不像您认为的那样。我建议使用
不存在
。如果你回来发表评论,我会发布一个答案(或者其他人会)。你能用一个例子进一步解释“如果有一种简单的方法可以通过返回具有最大描述的行来查询t1而不查询t2”吗?我感觉你不太清楚LEFT JOIN的作用,因为正如所写的那样,查询没有工作的机会。没有可能过滤掉行。左联接从不删除行。@Nick.McDermaid我尝试使用的不存在问题是,我有一个值对(名称、计划日期、取消日期),因此它不起作用。@usr:我知道左联接基本上通过第二个值将表扩展到右侧。如果我是,请纠正我wrong@betlor5有点,是的。您的示例代码并不像您认为的那样。我建议使用
不存在
。如果你回来发表评论,我会发布一个答案(或者其他人会)。你能用一个例子进一步解释“如果有一种简单的方法可以通过返回具有最大描述的行来查询t1而不查询t2”吗?我感觉你不太清楚LEFT JOIN的作用,因为正如所写的那样,查询没有工作的机会。没有可能过滤掉行。左联接从不删除行。@Nick.McDermaid我尝试使用的不存在问题是,我有一个值对(名称、计划日期、取消日期),因此它不起作用。@usr:我知道左联接基本上通过第二个值将表扩展到右侧。如果我是,请纠正我wrong@betlor5有点像,是的。带有NULL和EXISTS的解决方案不起作用,因为没有一个条目是唯一的,只有三个属性的组合是唯一的。如果不存在,它甚至返回一个空表。因为我想你一定误解了什么。NULL和EXISTS的解决方案不起作用,因为没有一个条目是唯一的,只有三个属性的组合是唯一的。如果不存在,它甚至返回一个空表。因为我想你一定是误会了什么。