【问题标题】:How do you exclude another table from a query in SQL Server?如何从 SQL Server 的查询中排除另一个表?
【发布时间】:2016-02-16 14:07:40
【问题描述】:

假设您有以下两个 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 中的行。

第二个问题是,如果实际上有一种简单的方法可以通过仅返回具有最大描述的行来在没有 t2 的情况下查询 t1。我尝试在 SQL Server 中查看它,但只能找到第一个标识符,这不适用于这种“精彩”的 sql 实现......

【问题讨论】:

  • 您的示例代码没有按照您的想法执行。我建议使用NOT EXISTS。如果您返回并发表评论,我将发布答案(或其他人会)。你能用一个例子进一步解释“如果有一种简单的方法可以通过只返回具有最大描述的行来查询 t1 而没有 t2”吗?
  • 我感觉您不太了解 LEFT JOIN 的作用,因为在编写时查询没有机会工作。没有可能过滤掉行。 LEFT JOIN 从不删除行。
  • @Nick.McDermaid 我尝试使用 NOT EXISTS 问题是,我有一个值对(名称、day_planed、day_canceled),因此它不起作用。
  • @usr:我知道左连接基本上将表扩展到右视图第二个。如果我错了,请纠正我
  • @betlor5 有点,是的。

标签: sql sql-server multiple-entries


【解决方案1】:

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

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
  )

或者您可以使用LEFT JOIN 并在您的ON 子句之后检查与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。

【讨论】:

  • NULL 和 EXISTS 的解决方案不起作用,因为没有一个条目是唯一的,只有三个属性的组合是唯一的。在 NOT EXISTS 的情况下,它甚至会返回一个空表。
  • 那么让我更明确一点。因为我认为你一定是误会了什么。
【解决方案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

【讨论】:

    猜你喜欢
    • 2020-11-07
    • 2014-04-11
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多