T-SQL-查找具有一个列值的行,该行与另一列的多个值出现相关联

时间:2019-04-12 19:11:42

标签: tsql search group-by query-optimization sql-server-2014

T-SQL-查找具有一个列值的行与另一列的多个值出现相关联。

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

({Group by将找到的相同的(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与选择@@ version = Microsoft SQL Server 2014(SP3)的基础SQL数据库一起使用

1 个答案:

答案 0 :(得分:1)

您不能通过简单的GROUP BY来做到这一点

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

这应该使您出现具有多个table1.col2值的table1.col1值