gpt4 book ai didi

sql - 计算具有相同关系的行数

转载 作者:行者123 更新时间:2023-12-02 13:18:05 25 4
gpt4 key购买 nike

我有三张 table 。调色板、颜色和一个关系表palette_color。就像这个示例一样:

http://sqlfiddle.com/#!6/fe832/2

我想计算关系表中具有相同颜色的调色板。正如您在示例中看到的那样,我已经这样做了。但我相信我的方法效率不高。运行大约需要2秒。

我正在使用 SQL Server。

这是我计算行数的地方:

(
SELECT count(DISTINCT palette_id) as total FROM palette_color COLOR
WHERE NOT EXISTS
(( (SELECT color_id FROM palette_color WHERE palette_id = PALETTE.id) EXCEPT (SELECT color_id FROM palette_color WHERE palette_id = COLOR.palette_id) )
UNION ALL
( (SELECT color_id FROM palette_color WHERE palette_id = COLOR.palette_id) EXCEPT (SELECT color_id FROM palette_color WHERE palette_id = PALETTE.id) ))
) as total

在 where 子句中,我确保只有第一个调色板出现在结果中

WHERE  id =
(
SELECT MIN(palette_id) FROM palette_color COLOR
WHERE NOT EXISTS
(( (SELECT color_id FROM palette_color WHERE palette_id = PALETTE.id) EXCEPT (SELECT color_id FROM palette_color WHERE palette_id = COLOR.palette_id) )
UNION ALL
( (SELECT color_id FROM palette_color WHERE palette_id = COLOR.palette_id) EXCEPT (SELECT color_id FROM palette_color WHERE palette_id = PALETTE.id) ))
)

最佳答案

在这里,我使用 FOR XML PATH 创建 palete_id 中所有 color_id 的字符串列表

然后对每组颜色进行分组并计数。

SQL FIDDLE DEMO (12毫秒)

with cList as (
SELECT p.id palette_id,
STUFF(( SELECT ',' + CAST(pc.color_id as varchar(10) )
FROM palette_color pc
WHERE pc.palette_id = p.id
ORDER BY pc.color_id
FOR
XML PATH('')
), 1, 1, '') AS ColorList
FROM palette p
)
select min(palette_id) palette_id, ColorList, count(*) Total
from cList
group by ColorList

关于sql - 计算具有相同关系的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32449261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com