Sql server COLLATE子句不能用于包含COLLATE子句的表达式
我有两张桌子:tab1和tab2。每个表只有一个VARCHARMAX列 我只需要获得那些值对,它们是相等的,但只有在不同的情况下才不同 输入示例:Sql server COLLATE子句不能用于包含COLLATE子句的表达式,sql-server,tsql,database-performance,Sql Server,Tsql,Database Performance,我有两张桌子:tab1和tab2。每个表只有一个VARCHARMAX列 我只需要获得那些值对,它们是相等的,但只有在不同的情况下才不同 输入示例: tab1.t1 tab2.t2 ----------------------- fff fff FFF fff Fff fff FFF FFA FfA FFF FFF aaa bbb aaa Related output: t1 t2 -------------------
tab1.t1 tab2.t2
-----------------------
fff fff
FFF fff
Fff fff
FFF FFA
FfA FFF
FFF aaa
bbb aaa
Related output:
t1 t2
-----------------------
fff FFF
FFF fff
Fff fff
Fff FFF
FfA FFA
表tab1和tab2在实际数据库中足够大,可以容纳800-1000行。我需要为大约500-600列生成此操作
所以我需要写一个快速的解决方案。
我写了一篇alghoritm:
使用区分大小写的排序规则从tab1中删除所有重复项
使用区分大小写的排序规则从tab2中删除所有重复项
使用不区分大小写的排序规则连接前面步骤中的结果集
使用区分大小写的排序规则筛选出值不相等的WHERE子句行
使用区分大小写的排序规则删除重复行
我试过:
SELECT DISTINCT tt.t1 COLLATE Cyrillic_General_CS_AS, tt.t2 COLLATE Cyrillic_General_CS_AS
FROM (
SELECT tt1.t1, tt2.t2
FROM
(
SELECT tab1.t1 COLLATE Cyrillic_General_CS_AS
AS t1
FROM (VALUES('fff'),('FFF'),('Fff'),('FFF'),('FfA'),('FFF'),('bbb')) AS tab1(t1)
GROUP BY tab1.t1 COLLATE Cyrillic_General_CS_AS
) tt1 INNER JOIN
(
SELECT tab2.t2 COLLATE Cyrillic_General_CS_AS
AS t2
FROM (VALUES('fff'),('fff'),('fff'),('FFA'),('FFF'),('aaa'),('aaa')) AS tab2(t2)
GROUP BY tab2.t2 COLLATE Cyrillic_General_CS_AS
) tt2
ON tt1.t1 = tt2.t2 COLLATE Cyrillic_General_CI_AS
) AS tt
WHERE tt.t1 <> tt.t2 COLLATE Cyrillic_General_CS_AS
但如果发生错误:
COLLATE子句不能用于包含COLLATE子句的表达式
请建议我如何在不使用用户定义函数、临时表或删除group by子句的情况下避免此问题。我尝试过这些函数,但它们几乎不会减慢执行速度。因为SQL Server可以以任何顺序处理联接,并且 将要在最终输出中计算的表达式结转 很早解析表达式,早在从数据中优化到初始检索时解析表达式 它不能保证在哪一阶段它将强制应用校对。因此,您只能将其应用于任何列/表达式一次。因为在外部查询中已经有DISTINCT,所以GROUP BY在派生表中是多余的,即使您觉得它会减少中间结果集的数量
SELECT DISTINCT tt.t1 COLLATE Cyrillic_General_CS_AS, tt.t2 COLLATE Cyrillic_General_CS_AS
FROM (
SELECT tt1.t1, tt2.t2
FROM
(VALUES('fff'),('FFF'),('Fff'),('FFF'),('FfA'),('FFF'),('bbb')) tt1(t1)
INNER JOIN
(VALUES('fff'),('fff'),('fff'),('FFA'),('FFF'),('aaa'),('aaa')) tt2(t2)
ON tt1.t1 = tt2.t2
) AS tt
WHERE tt.t1 <> tt.t2 COLLATE Cyrillic_General_CS_AS