【问题标题】:Inner Query in place of AND NOT EXISTS内部查询代替 AND NOT EXISTS
【发布时间】:2021-03-09 12:50:42
【问题描述】:

我正在尝试运行具有大约 10 个 AND NOT EXISTS 条件的复杂代码。我可以用 INNER Join 代替吗?

-----Initial Query---------

Select a FROM A1 WHERE 
NOT EXISTS (select 1 from B1 WHERE A1.a = B1.a)
AND NOT EXISTS (select 1 from C1 WHERE A1.a = C1.a)
AND NOT EXISTS (select 1 from D1 WHERE A1.a = D1.a)
AND NOT EXISTS (select 1 from E1 WHERE A1.a = E1.a)
AND NOT EXISTS (select 1 from F1 WHERE A1.a = F1.a)
AND NOT EXISTS (select 1 from G1 WHERE A1.a = G1.a)
AND NOT EXISTS (select 1 from H1 WHERE A1.a = H1.a)
AND NOT EXISTS (select 1 from I1 WHERE A1.a = I1.a)

----Processed Query-------

SELECT a FROM A1 WHERE a NOT IN (
Select a FROM A1 a1 WHERE 
INNER JOIN B1 b1 WHERE a1.a = b1.a)
INNER JOIN C1 c1 WHERE a1.a = c1.a)
INNER JOIN D1 d1 WHERE a1.a = d1.a)
INNER JOIN E1 e1 WHERE a1.a = e1.a)
INNER JOIN F1 f1 WHERE a1.a = f1.a)
INNER JOIN G1 g1 WHERE a1.a = g1.a)
INNER JOIN H1 h1 WHERE a1.a = h1.a)
INNER JOIN I1 i1 WHERE a1.a = i1.a))

谢谢..

【问题讨论】:

  • 也许更大的问题与您的架构有关。设计不佳的模式将需要笨拙且低效的代码。
  • @SMor 这只是一个关于我的真实查询的示例......我只是为它使用了不同的列名。

标签: sql-server tsql join


【解决方案1】:

否定inner join 不是你想要的。

您可以将其写为 left join,然后在 where 子句中过滤掉 NULLs

通过按照您的方式编写它,您正在强制 SQL Server 读取和连接内存中的所有这些表,可能会溢出到磁盘,以构建工作表。

一旦编译为执行计划,左连接可能会导致相同的左反半连接操作。但是,如果您的要求是从逻辑上排除行,not exists 是更可取且性能更高的方式。

【讨论】:

    【解决方案2】:

    正如@sTTu 所述,该语法不起作用。

    不过,还有另一种有效的语法:

    SELECT a, whatever_other_columns_here
    FROM A1
    WHERE NOT EXISTS(
    
    SELECT A1.a    -- note no FROM here
    INTERSECT
    SELECT a FROM B1
    INTERSECT
    SELECT a FROM C1
    INTERSECT
    SELECT a FROM D1
    INTERSECT
    SELECT a FROM E1
    INTERSECT
    SELECT a FROM F1
    INTERSECT
    SELECT a FROM G1
    INTERSECT
    SELECT a FROM H1
    INTERSECT
    SELECT a FROM I1
    )
    

    您可以通过将NOT EXISTS 切换为EXISTS 并将INTERSECT 切换为EXCEPT 来做同样的事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-15
      • 2021-07-06
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多