我们有一个SQL查询,它不是按照sql指南编写的。我们必须更改查询,但如果我们更改逻辑并删除内部查询,则需要花费很多时间来执行。以下是查询:
select col1,
col2,
case
when col1 <> '' then(select top 1
col1
from table1 as BP
where bp.col1 = FD.col1 order by BP.col1)
when col2 <> '' then(select top 1
BP.col2
from table1 as BP
where BP.col2 = FD.col2 order by BP.col2)
else ''
end
from table2 FD
上述查询用于将数据插入临时表。 table1拥有近1亿个数据。有没有办法删除内联查询以及良好的性能。我们已经在table1上创建了索引。有什么想法吗?
答案 0 :(得分:0)
试试这个
;WITH CTE
AS
(
SELECT
RN = ROW_NUMBER() OVER(ORDER BY COALESCE(T2.col1,T2.col2)),
T2.col1,
T2.col2,
T1Val = COALESCE(T2.col1,T2.col2,'')
FROM table2 T2
LEFT JOIN table1 T1
ON
(
(
ISNULL(T2.col1,'')<>'' AND T1.col1 = T2.col1
)
OR
(
ISNULL(T2.col2,'')<>'' AND T1.col2 = T2.col2
)
)
)
SELECT
*
FROM CTE
WHERE RN = 1
答案 1 :(得分:0)
这是我的谦虚帮助:
SELECT .. FROM table2 WHERE col1 <> ''
SELECT .. FROM table2 WHERE col1 = '' AND col2 <> ''
SELECT .. FROM table2 WHERE col1 = '' AND col2 = ''
在第一点创建表格时使用INNER JOIN
。
(如果您使用SSIS,则可以//并使用内部联接表进行查找)至少如果它不具备性能,您可以尝试:
OUTER APPLY (SELECT TOP 1 .. )
另一个想法应该是:
SELECT col1, col2, col1 AS yourNewCol
FROM table2 T2
WHERE EXISTS( SELECT 1 FROM table1 T1 WHERE T1.col1 = T2.col1)
UNION ALL
SELECT col1, col2, col2 AS yourNewCol
FROM table2 T2
WHERE
NOT EXISTS( SELECT 1 FROM table1 T1 WHERE T1.col1 = T2.col1)
AND EXISTS( SELECT 1 FROM table1 T1 WHERE T1.col2 = T2.col2)
UNION ALL
...
我没有为您提供干净的解决方案,但有些想法。 如果它对你有帮助,请告诉我。
此致 阿诺