我试图找到用户已经向后输入名字然后再次正确输入此人的情况。
FirstName LastName
----------------------
Doc Jones
Jones Doc
Doc Holiday
John Doe
我想要
Doc Jones
Jones Doc
我试过
Select FirstName, LastName
From People
Where FirstName Like '%' + LastName + '%'
但我没有得到任何结果,我知道有多个这样的实例。我知道我忽略了一些简单的事情。
答案 0 :(得分:3)
SELECT P1.FirstName, P1.LastName
FROM People P1
JOIN People P2
ON P1.FirstName = P2.LastName
AND P2.FirstName = P1.LastName
我看到的问题是你没有某种形式的ID,你无法看到重复批次之间重复的行是什么。
所以也许这样更好
SELECT P1.*, P2.*
FROM People P1
JOIN People P2
ON P1.FirstName = P2.LastName
AND P2.FirstName = P1.LastName
AND P1.FirstName < P1.LastName
你得到了
Doc Jones Jones Doc
答案 1 :(得分:1)
我倾向于使用exists
:
select p.*
from people p
where exists (select 1
from people p2
where p2.firstname = p.lastname and
p2.lastname = p.firstname
);
在您的情况下,这与join
之间的差异可能并不重要。但是,如果有许多行具有相同值的可能性,那么性能和结果集中将存在显着差异。这保证不会返回重复项 - 好吧,除了每个交换名称一行。
答案 2 :(得分:1)
只是为了完整起见。您也可以使用$1
:
INTERSECT
这将仅返回一对匹配的行,即:
Select FirstName, LastName
From People
INTERSECT
Select LastName, FirstName
From People
即使原始数据不止一次+-----------+----------+
| FirstName | LastName |
+-----------+----------+
| Doc | Jones |
| Jones | Doc |
+-----------+----------+
或Doc Jones
:
Jones Doc