Поиск идентификатора в другой таблице из списка дубликатов

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я пытаюсь получить список из таблицы Orders, где столбец Email_Id из таблицы Users содержит дубликаты (строки в пользователях с дублированными электронными письмами).

 SELECT
    o.[Email], o.[Email_Id], d.intCount
FROM (
     SELECT [Email], COUNT(*) as intCount
     FROM [Server].[dbo].[Table]
     GROUP BY [Email]
     HAVING COUNT(*) > 1
) AS d
    INNER JOIN [Server].[dbo].[Table] o ON o.[Email] = d.[Email]
 

Итак, я попробовал со следующим:

 SELECT * FROM [Server].[dbo].[Orders]
WHERE [Email_Id] IN/
    SELECT
        o.[Email], o.[Email_Id], d.intCount
    FROM (
         SELECT [Email], COUNT(*) as intCount
         FROM [Server].[dbo].[Users]
         GROUP BY [Email]
         HAVING COUNT(*) > 1
    ) AS d
        INNER JOIN [Server].[dbo].[Users] o ON o.[Email] = d.[Email]
)
 

Который возвращает только одно выражение, может быть указан в списке выбора, когда подзапрос не вводится с помощью EXISTS .

Также пробовал с:

 SELECT [Order_Is], (
SELECT
        o.[Email], o.[Email_Id], d.intCount
    FROM (
         SELECT [Email], COUNT(*) as intCount
         FROM [Server].[dbo].[Users]
         GROUP BY [Email]
         HAVING COUNT(*) > 1
    ) AS d
        INNER JOIN [Server].[dbo].[Users] o ON o.[Email] = d.[Email]
    )
as [Email_Id]
FROM [Server].[dbo].[Orders]
 

С теми же результатами.

Есть идеи, что я делаю не так?

Спасибо!

Комментарии:

1. Добавлен sql-server тег на основе используемого синтаксиса

2. Вторая попытка выглядит многообещающе, только IN для ключевого слова требуется один и тот же столбец для сравнения, без нескольких столбцов.

Ответ №1:

 SELECT * 
FROM [Server].[dbo].[Orders]
JOIN ( SELECT [Email], [Email_Id], 
               count(*) over (partition by [Email]) as cnt
         FROM [Server].[dbo].[Users] ) tt
  on tt.[Email_Id] = [Orders].[Email_Id] 
 and tt.[cnt] > 1
 

Ответ №2:

в вашем WHERE подзапросе оператора у вас может быть только одно поле или выражение для IN operator , вот что говорится в ошибке, попробуйте так:

 SELECT * FROM [Server].[dbo].[Orders]
WHERE [Email_Id] IN (
    SELECT
        o.[Email_Id]
    FROM (
         SELECT [Email], COUNT(*) as intCount
         FROM [Server].[dbo].[Users]
         GROUP BY [Email]
         HAVING COUNT(*) > 1
    ) AS d
        INNER JOIN [Server].[dbo].[Users] o ON o.[Email] = d.[Email]
)