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



下面是我的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子句中引用的表隐式限定。

因此,所有这些列都属于t:t.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来选择相关行的多个列。

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

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
);

相关内容

  • 没有找到相关文章