【问题标题】:SQL Server NOT EXISTS from more than one tableSQL Server 不存在于多个表中
【发布时间】:2011-03-04 12:29:21
【问题描述】:

如果存在,我需要返回行,如果不返回,则返回哪个传递的值不存在:

DECLARE @INPUT1 BIGINT
DECLARE @INPUT2 BIGINT
DECLARE @INPUT3 BIGINT

SELECT e.Name, d.Name, c.Name
   FROM Employee e
   JOIN Department d ON e.DeptID = d.DeptID
   JOIN City c ON e.CityID = c.CityID
WHERE
   e.EmpID = @INPUT1
   AND d.DeptID = @INPUT2
   AND c.CityID = @INPUT3

上述SQL中,所有输入INPUT1、INPUT2、INPUT3都正确传入,返回行。如果不是,我需要找出哪个 INPUTx 是错误的。我知道我可以编写 3 个不同的 Exists 查询来找出哪个不存在。有更好的方法吗?提前致谢。

【问题讨论】:

  • 我看不出你怎么能确定哪一个是错的。如果他们传入一个有效的员工、一个有效的部门和一个有效的城市怎么办,但它们并不是一起有效。你怎么知道哪一个(或多个)是“不正确的”?
  • 我假设 OP 意味着这 3 个值中的 1 个或多个不存在。 Wrong 可能不是描述它的正确方式:也许 not found 会更好。
  • MJB -- 根据您的评论编辑(不存在)
  • 感谢 Eric Petroelije -- 同意。但就我而言,我只想知道它是否不存在。 All are not valid 在我的真实场景中不起作用。

标签: sql sql-server performance tsql


【解决方案1】:

您不能使用(内部)连接,因为这会消除那些不匹配的记录。因此,您将不得不使用外部联接。鉴于此,无论如何使用 3 个查询可能会更快。实际上是 4,因为您需要 3 来检查 3 个值,然后另一个来返回您想要的值(如果存在)。

你可以这样做:

SELECT 'Employee Exists' as Result from Employee where EmpId = @INPUT1
union
SELECT 'Department Exists' from Department where DeptId = @INPUT2
union
SELECT 'City Exists' from City where CityId = @INPUT3

显示哪些不存在,然后返回与您的查询相关的内容。我猜你可以将它组合成 3 列而不是 3 行,但它仍然是 3 个查询。

【讨论】:

    【解决方案2】:

    您想要的确切逻辑尚不清楚,但此构造将过滤器应用为派生表,您可以对其进行左连接。因此,如果 d.Name 为空,则 @INPUT2 上不匹配

    DECLARE @INPUT1 BIGINT, @INPUT2 BIGINT, @INPUT3 BIGINT
    
    SELECT
        @INPUT1 AS NotThereIf_eName_IsNull,
        @INPUT2 AS NotThereIf_dName_IsNull,
        @INPUT3 AS NotThereIf_cName_IsNull,
        e.Name, d.Name, c.Name
    FROM
        (SELECT @INPUT1 AS EmpID,  @INPUT2 AS DeptID, @INPUT3 AS CityID) dummy
        LEFT JOIN 
        Employee e ON dummy.EmpID = e.EmpID
        LEFT JOIN 
        Department d ON dummy.DeptID = d.DeptID AND e.DeptID = d.DeptID
        LEFT JOIN 
        City c ON dummy.CityID = c.CityID AND e.CityID = c.CityID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多