2015-10-15 47 views
0

我有一个选择与子选择使用前1和where子句。SubSelect前1或左连接

我试图通过做子选择的左连接来优化选择,但查询时间花了更长的时间。在这种情况下再选择更好吗?我不能发布我的整个选择,因为它是太长,保密,但我会尝试重新跌破重要组成部分:

子选择

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 

尝一尝W /左连接

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 

有一个更好的方法吗?为什么左连接需要更长的查询时间?

+2

没有'ORDER BY'子句的'TOP'没有意义。另外:你的两个查询是不相同的。 –

+0

即时对不起,你是正确的,我会编辑。我忘了把订单通过 – Sid

+0

我认为你需要一个'INNER JOIN',而不是'LEFT JOIN'。 –

回答

0

您可以使用ROW_NUMBER

;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的值。

+0

我如何将这个包含在我的SP选择中? – Sid