我如何比较同一个表中的2行(SQL Server)

时间:2009-02-04 11:13:13

标签: sql sql-server tsql

我需要创建一个后台作业来处理一个表,查找与具有不同状态的特定id匹配的行。它将行数据存储在一个字符串中,以便将数据与具有匹配id的行进行比较。

我知道获取行数据的语法,但我从未尝试过比较同一个表中的2行?怎么做?我是否需要使用变量来存储每个数据?或者其他一些方式?

(使用SQL Server 2008)

6 个答案:

答案 0 :(得分:33)

您可以根据需要多次将表连接到自身,称为self join

为表的每个实例分配一个别名(如下例所示),以区分彼此。

SELECT a.SelfJoinTableID
FROM   dbo.SelfJoinTable a
       INNER JOIN dbo.SelfJoinTable b
         ON a.SelfJoinTableID = b.SelfJoinTableID
       INNER JOIN dbo.SelfJoinTable c
         ON a.SelfJoinTableID = c.SelfJoinTableID
WHERE  a.Status = 'Status to filter a'
       AND b.Status = 'Status to filter b'
       AND c.Status = 'Status to filter c' 

答案 1 :(得分:10)

好的,2年后终于要纠正语法:

SELECT  t1.value, t2.value
FROM    MyTable t1
JOIN    MyTable t2
ON      t1.id = t2.id
WHERE   t1.id = @id
        AND t1.status = @status1
        AND t2.status = @status2

答案 2 :(得分:6)

有些人发现以下替代语法更容易看到发生了什么:

select t1.value,t2.value
from MyTable t1
    inner join MyTable t2 on
        t1.id = t2.id
where t1.id = @id

答案 3 :(得分:2)

SELECT COUNT(*) FROM (SELECT * FROM tbl WHERE id=1 UNION SELECT * FROM tbl WHERE id=2) a

如果你有两行,那么它们是不同的,如果有的话 - 相同。

答案 4 :(得分:1)

SELECT * FROM A AS b INNER JOIN A AS c ON b.a = c.a
WHERE b.a = 'some column value'

答案 5 :(得分:0)

我遇到一种情况,我需要将表的每一行与 next 行进行比较(下一条是相对于我的问题说明),在示例中,下一行是使用row_number()函数中的order by子句。

所以我写了这个:

DECLARE @T TABLE (col1 nvarchar(50));

insert into @T VALUES ('A'),('B'),('C'),('D'),('E')

select I1.col1 Instance_One_Col, I2.col1 Instance_Two_Col  from (
 select col1,row_number() over (order by col1) as row_num
 FROM @T
) AS I1
left join (
 select col1,row_number() over (order by col1) as row_num
 FROM @T
) AS I2 on I1.row_num = I2.row_num - 1

之后,我可以根据需要将每一行与下一个进行比较