在SQL Server的不同列中查找任何重复值

在SQL Server的不同列中查找任何重复值,sql,sql-server,Sql,Sql Server,我有一个表,其中的列如下所示 id phone1 phone2 Phone3 Phone4 phone5 我想找到任何电话号码与其他电话号码匹配的id。我在谷歌上搜索过这个网站,但没有找到答案 先谢谢你 //Nisse对于这样的车型,您必须这样做: SELECT id FROM dbo.TableName WHERE phone1 = phone2 OR phone1 = phone3 OR phone1 = phone4 OR phone1 = phone5 OR

我有一个表,其中的列如下所示

id  phone1 phone2 Phone3 Phone4 phone5
我想找到任何电话号码与其他电话号码匹配的id。我在谷歌上搜索过这个网站,但没有找到答案

先谢谢你


//Nisse

对于这样的车型,您必须这样做:

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)

对于这样的模型,您必须这样做:

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)
另一种方法是对表值构造函数使用交叉应用

另一种方法是对表值构造函数使用交叉应用


如果您使用的是名称-值对模型,那么您所要做的就是取消对表的PIVOT,使其以您希望的方式返回数据。如果您没有使用名称-值对表,我建议您重新考虑该表的设计

如果您使用的是名称-值对模型,那么您所要做的就是取消激活表,使其以您希望的方式返回数据。如果您没有使用名称-值对表,我建议您重新考虑该表的设计

您可以使用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;

您可以使用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;

这是一个坏数据模型的标志-如果您将数据存储在多个列中,并且希望将其视为同一列,则表明它们应该在该表或单独的表中作为一列结束,现在每个id最多有5行这是一个坏数据模型的标志-如果您将数据存储在多个列中,并且希望将其视为同一列,则表明它们应该在该表或单独的表中作为一列结束,每个id最多有5行您不是指按id分组吗,PhoneNumber具有COUNT*>1?此返回具有多个电话号码的所有id,您需要具有COUNTPhoneNumber COUNTDISTINCT PhoneNumber您不是指按id分组,PhoneNumber具有COUNT*>1?此返回具有多个电话号码的所有id,您需要具有COUNTPhoneNumber COUNTDISTINCT PhoneNumber