SQL改进 - UNION?

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"类型的项目.

Tim*_*ter 5

也许我误解了一些东西,但这不是你真正想要的东西:

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)

有三种类型:酷或不酷和其他一切,你不需要过滤器(只是唯一的).