在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