adl*_*val 2 sql t-sql sql-server
我有2个表:"包"和"项目".
" packages"包含以下列:pack_id | item_id
" items"有以下列.......: item_id | type
一个包可以有多个 项目.
更新:
样本数据和预期结果:
pack_id | item_id
1 1
1 2
1 3
2 2
2 1
3 4
3 5
3 6
item_id | type
1 C
2 F
3 Z
4 Z
5 Z
6 Z
Run Code Online (Sandbox Code Playgroud)
预期结果:
pack_id | pack_type
1 Mixed
2 Cool
3 Not Cool
Run Code Online (Sandbox Code Playgroud)
我的问题是:
是否有更好的方法来查询这两个表,以获得第三个表,具有列:"pack_id"和新列"pack_type"?那些UNION似乎为运行时间增加了大量时间.
SELECT pack_id, pack_type
FROM (
-- CASE 1 - pack_type is 'Cool' - type 'C' or 'F', but not 'Z'
SELECT Distinct q1.pack_id, 'Cool' AS pack_type
FROM (
SELECT Distinct p.pack_id, i.type
FROM packages p
INNER JOIN items i
ON p.item_id = i.item_id
WHERE i.type <> 'Z') q1
WHERE q1.type IN ('C','F')
UNION
-- CASE 2 - pack_type is 'Not-Cool' - type 'Z', but not 'C' or 'F'
SELECT Distinct q2.pack_id, 'Not-Cool' AS pack_type
FROM (
SELECT Distinct p.pack_id, i.type
FROM packages p
INNER JOIN items i
ON p.item_id = i.item_id
WHERE i.type = 'Z') q2
WHERE q2.type NOT IN ('C','F')
UNION
-- CASE 3 - pack_type is 'Mixed' - type 'Z' and ('C' or 'F')
SELECT Distinct q3.pack_id, 'Mixed' AS pack_type
FROM (
SELECT Distinct p.pack_id, i.type
FROM packages p
INNER JOIN items i
ON p.item_id = i.item_id
WHERE i.type = 'Z') q3
WHERE q3.type IN ('C','F')
) m
Run Code Online (Sandbox Code Playgroud)
注意:多个注释的一些解释指向"A类型不能是Z也可以是C或F".
我也想过,但我理解查询行为的方式是,如果你说"输入IN('C','F')",它会查看每个类型'C'或'F'的项目,获取具有该项目的包ID.但是,具有"C"或"F"类型的项目的包也可以具有"Z"类型的项目,因此是内部选择,首先处理"Z"类型的项目.
也许我误解了一些东西,但这不是你真正想要的东西:
SELECT DISTINCT
pack_id,
pack_type = CASE WHEN i.type IN ('C','F') THEN 'Cool'
WHEN i.type IN ('Z') THEN 'Not-Cool'
ELSE 'Mixed' END
FROM packages p INNER JOIN items i ON p.item_id = i.item_id
Run Code Online (Sandbox Code Playgroud)
有三种类型:酷或不酷和其他一切,你不需要过滤器(只是唯一的).