0

我被告知要删除联合并将查询的上半部分更改为一个,有人告诉我这很容易,但我无法弄清楚。有人告诉我,它将包括类似

其中红色(主要颜色)= 红色(SilksName)其中蓝色(主要颜色)= 蓝色(SilksName)等

Select S.[Silks_Skey]
    from [dbo].[Silks] S 
    inner join [dbo].[SubColour] SC on CHARINDEX(SC.[SubColour],S.[SilksName]) <> 0
    inner join [dbo].[MajorColour] MC on SC.[MajorColour] = MC.[MajorColour]

    UNION ALL

    Select S.[Silks_Skey], MC.[MajorColour_Skey] 
    from [dbo].[Silks] S 
    inner join [dbo].[MajorColour] MC on CHARINDEX(MC.[MajorColour],S.[SilksName]) <> 0

    ORDER BY S.[Silks_Skey]
4

2 回答 2

1

我认为没有理由UNION ALL从查询中删除,这是最好的选择,尽管您可以将 UNION 移动到子查询:

SELECT  S.[Silks_Skey], c.[MajorColour_Skey] 
FROM    [dbo].[Silks] S 
        INNER JOIN
        (   SELECT  [Colour] = sc.[SubColour], mc.[MajorColour_Skey]
            FROM    [dbo].[SubColour] sc
                    INNER JOIN [dbo].[MajorColour] mc 
                        ON sc.[MajorColour] = mc.[MajorColour]
            UNION ALL
            SELECT  mc.[MajorColour], mc.[MajorColour_Skey]
            FROM    [dbo].[MajorColour] mc 
        ) c
            ON CHARINDEX(c.[Colour], S.[SilksName]) <> 0

如果你必须删除UNION你可以使用这个:

SELECT  S.[Silks_Skey], mc.[MajorColour_Skey] 
FROM    [dbo].[Silks] S
        LEFT JOIN [dbo].[SubColour] sc
            ON CHARINDEX(sc.[SubColour], S.[SilksName]) <> 0
        INNER JOIN [dbo].[MajorColour] mc
            ON CASE WHEN sc.SubColour IS NOT NULL AND mc.MajourColour = sc.MajourColour THEN 1
                    ELSE CHARINDEX(mc.[MajorColour], S.[SilksName]) <> 0 
                END <> 0

但我无法想象它的表现会比 UNION 更好。

请注意,我刚刚看到您的答案,我会选择CASEin the join 而不是OR, case 语句将短路,因此当子颜色存在时,它不会评估第二部分,而 OR 将评估两者。

于 2013-05-03T10:17:31.620 回答
0

想通了谢谢

Select S.[Silks_Skey], MC.[MajorColour_Skey]
from [dbo].[Silks] S 
left join [dbo].[SubColour] SC on CHARINDEX(SC.[SubColour],S.[SilksName]) <> 0
inner join [dbo].[MajorColour] MC on SC.[MajorColour] = MC.[MajorColour]
or CHARINDEX(MC.[MajorColour],S.[SilksName]) <> 0
于 2013-05-03T10:09:17.073 回答