Sql server 再选择顶部1或左侧连接
我有一个Select,子Select使用Top 1和where子句 我试图通过对子选择进行左连接来优化选择,但查询时间较长。在这种情况下subselect更好吗?我无法发布我的全部选择,因为它太长且保密,但我将尝试重新创建以下重要部分: 子选择Sql server 再选择顶部1或左侧连接,sql-server,Sql Server,我有一个Select,子Select使用Top 1和where子句 我试图通过对子选择进行左连接来优化选择,但查询时间较长。在这种情况下subselect更好吗?我无法发布我的全部选择,因为它太长且保密,但我将尝试重新创建以下重要部分: 子选择 SELECT (select top 1 colId FROM table1 WHERE col1 = b.Id and col2 = 3 Order by 1) Id3, (select top 1 colId FROM table1 WHERE c
SELECT
(select top 1 colId FROM table1 WHERE col1 = b.Id and col2 = 3 Order by 1) Id3,
(select top 1 colId FROM table1 WHERE col1 = b.Id and col2 = 5 Order by 1) Id5,
(select top 1 colId FROM table1 WHERE col1 = b.Id and col2 = 7 Order by 1) Id7
FROM table2 b
尝试使用左连接
SELECT
t1.colid id3,
t2.colid id5,
t3.colid id7
FROM table2 b
LEFT JOIN (
select colId, col1 FROM table1 WHERE col2 = 3
) t1 ON t1.col1 = b.Id
LEFT JOIN (
select colId, col1 FROM table1 WHERE col2 = 5
) t2 ON t1.col1 = b.Id
LEFT JOIN (
select colId, col1 FROM table1 WHERE col2 = 7
) t3 ON t1.col1 = b.Id
有更好的方法吗?为什么左连接需要更长的查询时间?您可以使用
行号
:
;WITH cte AS
(
SELECT a.colId,
rn = ROWN_NUMBER() OVER (PARTITION BY a.col2 ORDER BY a.col1)
FROM table1 a
LEFT JOIN table2 b on a.col1 = b.id
WHERE a.col2 IN (3,5,7)
)
SELECT *
FROM cte
WHERE rn = 1
这将为每个
col2
值提供第一行,您可以限制要设置为3,5,7的值。TOP
没有ORDER BY
子句是没有意义的。另外:您的两个查询不相等。对不起,您是正确的,我将进行编辑。我忘了按下单了我想你需要一个内部联接
,而不是左联接
。@MorganThrapp不内部联接筛选我的行如果它不存在?虽然子选择TOP 1/Left联接可以为一行返回空值,但您应该放弃按顺序位置排序的习惯。它不仅让人非常困惑,而且还被弃用。想想列更改时会发生什么情况,如果您不同时更改顺序,则可能会得到错误的结果。我如何将其包括在SP Select中?