Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 再选择顶部1或左侧连接_Sql Server - Fatal编程技术网

Sql server 再选择顶部1或左侧连接

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和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 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中?