首先感谢你的帮助。
我刚开始使用tsql而且我遇到了性能问题。
我有两个表 table1 和 table2 , table2 给我很多f模式,如果我在每行中找到,我会检查 table1 ,如果发生,我会保存到 table1 中的另一列。
所以我将这个字符串转换为regexp并使用" Like"像这样表达
UPDATE table1 AS tb1
SET CASE
WHEN tb1.ft IS NOT NULL tb1.ft = tb1.ft + ',' +tb2.[as]
ELSE tb1.ft = tb2.[as]
FROM table1,
INNER JOIN (
SELECT DISTINCT [as]
FROM table2
) AS tb2
ON fn like '%' +tb2.[as]+'%' OR fp like '%' +tb2.[as]+'%'
你们认为有办法改善表现吗?我有点陷入这个解决方案
p.s:我没有测试更新,只有一个选择。
答案 0 :(得分:3)
首先,正确的语法看起来更像是这样:
UPDATE t1
SET ft = COALESCE(tb1.ft + ',' +tb2.x, tb2.x)
ELSE tb1.ft = tb2.x
FROM table1 t1 INNER JOIN
(SELECT DISTINCT [as] as x
FROM table2
) t2
ON t1.fn like '%' + tb2.x + '%' OR t1.fp like '%' + t2.x + '%';
性能仍然不好,但这至少可以达到你想要的效果。
至于进一步的性能提升,我怀疑你需要放弃它。这在SQL Server中很难改进。我注意到您似乎正在构建以逗号分隔的列表。这表明数据模型非常糟糕。因此,可能有一些方法可以使用不同的数据模型来解决您的问题。如果您有兴趣,可以提出另一个问题,详细了解您要完成的工作 - 并提供样本数据和所需结果。
答案 1 :(得分:0)
在不知道表的数量/大小的情况下,很难评估查询性能。我通常将查询分为临时表步骤。如果每个临时表的数据集都很小。
-- put to temp table t2
SELECT DISTINCT [as] as x
into #t2
FROM table2;
-- put to temp table t3
SELECT tb1.id, tb1.ft, #t2.x into #t3
FROM table1 t1 INNER JOIN #t2 on t1.fn like '%' + #t2.x + '%' OR t1.fp like '%' + #t2.x + '%';
--collapse it as Gordon Linoff or try the following methods
--refer to https://stackoverflow.com/questions/194852/how-to-concatenate-text-from-multiple-rows-into-a-single-text-string-in-sql-serv
UPDATE t1
SET ft = COALESCE(tb1.ft + ',' +tb2.x, tb2.x)
ELSE tb1.ft = tb2.x
FROM table1 t1 INNER JOIN #t3 on t1.id = #t3.id
参考How to concatenate text from multiple rows into a single text string in SQL server? 崩溃。
请在我的SQL编辑器https://sqleditor.net/q/HJIWTnSuM
中找到明确版本