Tsql T-SQL—查找具有一个列值且与另一列的多个值关联的行
T-SQL——查找具有一个列值且与另一列的多个值关联的行。 目标是查找table1.col1值的引用,这些值具有table1.col2的多个值。(注意:两个表中的值都不是固定的,例如,我们不是在搜索诸如“ABC”之类的模式,而是必须是一个特定的值。) (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
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”的速度一样快,这取决于底层优化器,甚至取决于编译的机器代码,所以做得很好。我编辑了我的问题以反映上面的评论。无论如何,这个答案似乎在各方面都很好。