T-SQL - найти строки с одним значением столбца, которые связаны с несколькими вхождениями значений другого столбца.
Цель состоит в том, чтобы найти вхождения значений table1.col1, которые имеют несколько значений для table1.col2. (ПРИМЕЧАНИЕ. Значение в любой таблице не является фиксированным, например, мы не ищем такой шаблон, как «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
В приведенном выше коде внутреннее предложение «has» на самом деле не нужно, равно как и ключевые слова «top», но они немного ускоряют процесс.
Есть ли у кого-нибудь лучший способ или способ ускорить это?
В этом примере все столбцы - nvarchar (255).
Я использую SSMS 14.017 с базовой базой данных SQL select @@ version = Microsoft SQL Server 2014 (SP3)