2015-02-16 2 views
1

У меня есть таблица с столбцами, которая выглядит так.Найти любое повторяющееся значение в разных столбцах SQL Server

id phone1 phone2 Phone3 Phone4 phone5 

Я хотел бы найти id's где любой из phonenumbers матча любых других. Я googled и искал этот сайт, но не нашел ответа.

Заранее спасибо.

// Nisse

+8

Это признак плохой модели данных - если у вас есть данные, хранящиеся в нескольких столбцах, которые вы хотите обработать то же самое, что указывает на то, что они должны закончиться (в этой или отдельной таблице, содержащей до 5 строк для каждого 'id') –

ответ

4

С моделью, как это вы должны идти по этому пути:

SELECT id 
FROM dbo.TableName 
WHERE phone1 = phone2 
OR phone1 = phone3 
OR phone1 = phone4 
OR phone1 = phone5 
OR phone2 = phone3 
OR phone2 = phone4 
OR phone2 = phone5 
OR phone3 = phone4 
OR phone3 = phone5 
OR phone4 = phone5 

Если вы имели другую таблицу, где вы храните этот телефонный-номер, который связан с помощью внешнего ключа вы могли бы сделать:

SELECT t.id 
FROM dbo.TableName t INNER JOIN dbo.PhoneNumbers p 
    ON t.ID = p.FkID 
GROUP BY id 
HAVING COUNT(p.PhoneNumber) <> COUNT(DISTINCT p.PhoneNumber) 
+0

Не имеете в виду« GROUP BY id, PhoneNumber HAVING COUNT (*)> 1 "? – jarlh

+1

Это возвращает все идентификаторы, имеющие более одного номера телефона, вам нужно «HOWING COUNT (PhoneNumber) <> COUNT (DISTINCT PhoneNumber)' – dnoeth

+0

@dnoeth: good catch, corrected. –

1

другой способ использует cross apply с table valued constructor

SELECT id 
FROM Yourtable 
     CROSS apply (VALUES ('Phone1',Phone1), 
          ('Phone2',Phone2), 
          ('Phone3',Phone3), 
          ('Phone4',Phone4), 
          ('Phone5',Phone5)) cs(cname, data) 
GROUP BY id, 
      data 
HAVING Count(1) > 1 
0

Если вы используете модель пары «Имя-значение», все, что вам нужно сделать, это UNPIVOT вашей таблицы, чтобы заставить ее возвращать данные, как вы хотите, чтобы они выглядели. Если вы не используете парную таблицу Name-Value, я бы предложил пересмотреть дизайн таблицы.

0

Вы можете использовать UNION ALL:

WITH cte AS (
    SELECT id, phone1 AS phone FROM mytable 
    WHERE phone1 IS NOT NULL 
    UNION ALL 
    SELECT id, phone2 AS phone FROM mytable 
    WHERE phone2 IS NOT NULL 
    UNION ALL 
    SELECT id, phone3 AS phone FROM mytable 
    WHERE phone3 IS NOT NULL 
    UNION ALL 
    SELECT id, phone4 AS phone FROM mytable 
    WHERE phone4 IS NOT NULL 
    UNION ALL 
    SELECT id, phone5 AS phone FROM mytable 
    WHERE phone5 IS NOT NULL 
) 
SELECT id FROM (
    SELECT id, phone, COUNT(*) FROM cte 
    GROUP BY id, phone 
    HAVING COUNT(*) > 1 
) dup; 
Смежные вопросы