T-SQL - найти строки с одним значением столбца, которые связаны с несколькими значениями вхождения другого столбца - PullRequest
0 голосов
/ 12 апреля 2019

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)

1 Ответ

1 голос
/ 12 апреля 2019

Разве вы не можете сделать это с помощью простого GROUP BY

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

Это должно получить вас вхождения значений table1.col1, которые имеют несколько значений для table1.col2

...