查找colunm2中第1列中值的行

时间:2016-01-22 19:49:41

标签: sql sql-server

我试图找到用户已经向后输入名字然后再次正确输入此人的情况。

FirstName    LastName
----------------------
Doc          Jones
Jones        Doc
Doc          Holiday
John         Doe

我想要

Doc Jones
Jones Doc

我试过

Select FirstName, LastName 
From People
Where FirstName Like '%' + LastName + '%'

但我没有得到任何结果,我知道有多个这样的实例。我知道我忽略了一些简单的事情。

3 个答案:

答案 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