Sql server 在SQL查询中设置差异

Sql server 在SQL查询中设置差异,sql-server,tsql,query-optimization,Sql Server,Tsql,Query Optimization,我正在尝试使用语句选择记录 SELECT * FROM A WHERE LEFT(B, 5) IN (SELECT * FROM (SELECT LEFT(A.B,5), COUNT(DISTINCT A.C) c_count FROM A GROUP BY LEFT(B,5) ) p1 WHERE p1.c_count = 1 ) AND C IN (S

我正在尝试使用语句选择记录

SELECT * 
FROM A 
WHERE 
  LEFT(B, 5) IN 
    (SELECT * FROM 
       (SELECT LEFT(A.B,5), COUNT(DISTINCT A.C) c_count 
        FROM A 
        GROUP BY LEFT(B,5)
       ) p1 
       WHERE p1.c_count = 1
     ) 
     AND C IN 
        (SELECT * FROM 
            (SELECT A.C , COUNT(DISTINCT LEFT(A.B,5)) b_count 
             FROM A 
             GROUP BY C
            ) p2 
          WHERE p2.b_count = 1)
这需要很长时间才能运行约15秒


是否有更好的方法编写此SQL

嗯,不确定您在这里真正想要做什么-但显然,
左(B,5)
表达式不断出现。因为您使用的是函数,所以您放弃了使用索引的任何机会

在SQL Server表中可以做的是为该表达式创建一个计算的、持久化的列,然后在该列上放置一个索引:

ALTER TABLE A
   ADD LeftB5 AS LEFT(B, 5) PERSISTED

CREATE NONCLUSTERED INDEX IX_LeftB5 ON dbo.A(LeftB5)
现在使用新的计算列
LeftB5
代替查询中的任何位置的
LEFT(B,5)
——这将有助于加快某些查找和
分组操作


另外-您在其中有一个
按C进行分组
-该列是否已编制索引?

您不需要从嵌套的子查询返回数据。我不确定这是否会对IUT索引产生影响,但它更容易阅读

EXISTS/JOIN可能比在中使用更好

SELECT * 
FROM
    A 
    JOIN
    (SELECT LEFT(B,5) AS b1
        FROM A 
        GROUP BY LEFT(B,5)
        HAVING COUNT(DISTINCT C) = 1
    ) t1 On LEFT(A.B, 5) = t1.b1
    JOIN
    (SELECT C AS C1
        FROM A 
        GROUP BY C
        HAVING COUNT(DISTINCT LEFT(B,5)) = 1
    ) t2 ON A.C = t2.c1
但你至少需要一个marc_说的计算列


和两个索引:一个在
(computed,C)
上,另一个在
(C,computed)
上。如果您想在SQL中表示集合差(A-B),这里有一个解决方案。 假设您有两个表A和B,并且希望检索仅存在于A中而不存在于B中的所有记录,其中A和B通过名为ID的属性具有关系。 对此的有效查询是:

# (A-B)
SELECT DISTINCT A.* FROM (A LEFT OUTER JOIN B on A.ID=B.ID) WHERE B.ID IS NULL

-来自Jayaram Timsina的博客

如果您正在查找,只需设置
表1
表2
之间的差异, 下面的查询很简单,它给出了
table1
中的行,但不在
table2
中,因此两个表都是相同架构的实例,列名称如下所示
第一列
第二列

with 
col1 as (
  select columnone from table2
  ),
col2 as (
  select columntwo from table2
)
...
select * from table1
where (
  columnone not in col1 
  and columntwo not in col2
  ...
);

您必须使用模式提供示例输入和输出数据。。。接受更多的回答:啊哈。好吧,有时候有不止一个有效答案,我无法决定接受哪一个答案。有很多问题需要我们回答,我们可能会决定回答那些我们获得声誉和勾选框的问题