繁体   English   中英

SQL:如何比较同一表中的两行,其中第二行由第一个值给出

[英]SQL: How to compare two rows from same table where second row is given by first's values

下面是我的 SQL Server 查询,效果很好,但正如您所见,我多次获取同一行。 有没有办法通过只做一次 SELECT 来优化它? 谢谢。

SELECT TOP 1 1
FROM some_table
WHERE col1 = @col1
  AND (col2 IN ('N', 'C', 'U') OR 
       col3 != (SELECT t.col3 FROM some_table t 
                WHERE t.id = id AND t.revision_id = revision_id - 1) OR
       col4 != (SELECT t.col4 FROM some_table t 
                WHERE t.id = id AND t.revision_id = revision_id - 1) OR
       col5 != (SELECT t.col5 FROM some_table t 
                WHERE t.id = id AND t.revision_id = revision_id - 1) OR
       col6 != (SELECT t.col6 FROM some_table t 
                WHERE t.id = id AND t.revision_id = revision_id - 1)
      )

注意:我只需要查看是否存在这样的列(请参阅SELECT 1 1 ),这很可能是1大多数时候。 所以我不想加入有数百万行的表。

首先,子查询中的列名有错误。 请参见限定子查询中的列名

语句中的列名由同一级别的 FROM 子句中引用的表隐式限定。

因此,所有这些列都属于tt.id=id AND t.revision_id=revision_id-1

和查询:

SELECT TOP 1 1
FROM some_table s
WHERE   col1=@col1
    AND 
        (
            col2 IN ('N','C','U') OR 
            EXISTS(SELECT * FROM some_table where id = s.id
               AND revision_id = s.revision_id - 1 AND
               (col3 != s.col3 OR col4 != s.col4 OR col5 != s.col5 OR col6 != s.col6)
            )
        )

您可以在此处使用apply从相关行中选择多个列。

这只是您需要的近似值,因为您没有提供任何示例数据和预期结果。 如果apply可以返回多行,您可能需要使用带有适当order by子句或聚合的top (1)

select * 
from some_table t
outer apply (
  select col3, col4, col5, col6
  from some_table t2
  where t2.id = t.id AND t2.revision_id = t.revision_id-1
)t2
where col1 = @col1
and (
  col2 IN ('N','C','U') or
    t.col3 != t2.col3 or
    t.col4 != t2.col4 or
    t.col5 != t2.col5 or
    t.col6 != t2.col6
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM