Tsql T-SQL—查找具有一个列值且与另一列的多个值关联的行

Tsql T-SQL—查找具有一个列值且与另一列的多个值关联的行,tsql,search,group-by,query-optimization,sql-server-2014,Tsql,Search,Group By,Query Optimization,Sql Server 2014,T-SQL——查找具有一个列值且与另一列的多个值关联的行。 目标是查找table1.col1值的引用,这些值具有table1.col2的多个值。(注意:两个表中的值都不是固定的,例如,我们不是在搜索诸如“ABC”之类的模式,而是必须是一个特定的值。) (groupby将查找相同的(col1,col2)元组的对。) 实际上,我有一些代码,我认为理论上是正确的,但在我的系统上运行非常非常缓慢: -- find examples where the 1st-column value exists on

T-SQL——查找具有一个列值且与另一列的多个值关联的行。

目标是查找table1.col1值的引用,这些值具有table1.col2的多个值。(注意:两个表中的值都不是固定的,例如,我们不是在搜索诸如“ABC”之类的模式,而是必须是一个特定的值。)

groupby
将查找相同的(col1,col2)元组的对。)

实际上,我有一些代码,我认为理论上是正确的,但在我的系统上运行非常非常缓慢:

-- find examples where the 1st-column value exists on more than one second-column value to test this. 

Select TOP 10 [Col_1], count(1) as countRows_outer from
(
    SELECT [Col_2]
          ,[Col_1]
          ,count(1) as countRowsInner

      FROM [OurDatabase].[dbo].[OurTable]
      WHERE 
      (
        (Col_1 is not null)
        and
        (len (Col_1) > 0)
      )
      group by [Col_2] ,[Col_1] -- after studying:  Inner group by *NOT* needed
      having (count(1) >= 2) -- not really needed, but limits search set, faster query results
        --order by  [Col_1],  [Col_2] -- , countRows desc
)c1
group by Col_1
having(count(1)  >= 2) -- > 1 (per answer below, may be more efficient here)
order by countRows_outer desc
在上面的代码中,实际上不需要内部的having子句,也不需要“top”关键字,但它们会加快速度

有没有人有更好的办法,或者说,有没有办法加快这一进程

对于本例,所有列都是nvarchar(255)


我将SSMS 14.017与select@@version=Microsoft SQL Server 2014(SP3)的基础SQL数据库一起使用。

您不能通过简单的分组方式来执行此操作吗

SELECT col1
FROM 
    table
GROUP BY col1
HAVING COUNT(DISTINCT col2)> 1

这将使您获得table1.col1值的出现次数,这些值具有table1的多个值。col2

不确定为什么这里会有向下投票?顶部查询中的内部“group by”是不需要的,它只会计算(col1,col2)对,因此会得到不同的结果。我认为答案是一个更好的查询,并且工作正确,速度更快。可能“>1”的速度至少与“>=2”的速度一样快,这取决于底层优化器,甚至取决于编译的机器代码,所以做得很好。我编辑了我的问题以反映上面的评论。无论如何,这个答案似乎在各方面都很好。