如何比较同一张表(SQL Server)中的 2 行?

Posted

技术标签:

【中文标题】如何比较同一张表(SQL Server)中的 2 行?【英文标题】:How do I compare 2 rows from the same table (SQL Server)? 【发布时间】:2010-10-05 09:14:39 【问题描述】:

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

我知道获取行数据的语法,但我以前从未尝试过比较同一张表中的 2 行。它是如何完成的?我需要使用变量来存储每个变量的数据吗?还是其他方式?

(使用 SQL Server 2008)

【问题讨论】:

您可能会发现它很有帮助forums.asp.net/t/… 【参考方案1】:

您可以根据需要多次将表连接到自身,称为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' 

【讨论】:

很高兴你提到你必须别名 实际上没有你需要的次数.. 在查询中引用 256 个表是有限制的:] @pkmiec 听起来很有趣,Microsoft docs about SQL Server limitations 与您的论点不同 - Tables per SELECT statement - Limited only by available resources。我仍然不确定我是否会使用这些信息,除非我设计的东西真的很糟糕,但我想知道你是怎么得到这个数字的,它看起来很有趣。 @Nikhil Girraj 好吧.. 这么长时间后我无法引用来源。我想我是在 SQL Server 2005 中偶然发现的……当前的文档说没有限制,但请继续尝试运行这样的 SQL :) pastebin.com/hfSGiNkQ @pkmiec 很抱歉,我没有注意到这篇文章有多长 :)。我会接受这是一个旧限制,在新版本中不存在。而且,我运行了您引用的查询,3 分钟后输出为 There is insufficient system memory in resource pool 'default' to run this query.【参考方案2】:

好的,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

【讨论】:

您不应该使用该语法。请改用特定的联接。不推荐使用该语法的左连接和右连接形式。如果在下一个版本中不推荐使用此表单,我不会感到惊讶。 @HLGEM - 您能否提供链接,说明在何处提及已弃用? @Pauk ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10sq_GetStart/html/c10eeaa5-3d3c-49b4-a4bd-5dc4fb190142.htm 即使他们没有;t 不赞成使用左右版本,因为它们会给出不一致且有时不准确的结果。它们有时可以被解释为交叉连接而不是左连接或右连接。 这个链接可能比 ms-help 更有用:msdn.microsoft.com/en-us/library/dd172122.aspx【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

如果你有两行,它们是不同的,如果一个 - 相同。

【讨论】:

【参考方案5】:
SELECT * FROM A AS b INNER JOIN A AS c ON b.a = c.a
WHERE b.a = 'some column value'

【讨论】:

【参考方案6】:

我遇到过一种情况,我需要将表的每一行与 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

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

【讨论】:

以上是关于如何比较同一张表(SQL Server)中的 2 行?的主要内容,如果未能解决你的问题,请参考以下文章

同一张表中的 SQL DATE 比较

SQL Server:如何为同一张表中的不同客户获取 3 天内的滚动总和

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

如何用通配符比较同一张表中的两条记录?

比较同一张表oracle中的数据

SQL Server 中的条件联合,直到到达特定日期