0

我正在学习 SQL 并一直在处理这个查询:

SELECT 
    [Theme].[Name], [ThemeType].[Type] 
FROM 
    [Theme] 
LEFT OUTER JOIN 
    [ThemeType] ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType]
JOIN 
    [ProductTheme] ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme]
WHERE 
    ProductTheme.ProductID LIKE '%' 
    AND ProductTheme.ThemeId = Theme.PK_Theme 
    AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%[0-9]%' 
ORDER BY 
    CASE WHEN [THEMETYPE].[TYPE] IS NULL 
         THEN 0 
         ELSE 1 
    END, 
    [THEMETYPE].[TYPE] 

有两个部分需要可变。两者都是 LIKE 语句。

第二个效果很好,我可以将其更改为 %、Null 或 %[0-9]% 以获取全部、仅空值或仅非空值

第一个在专门分配时可以正常工作:

WHERE ProductTheme.ProductID = 1

在此处输入图像描述

但是,当我这样做时,我也需要它是可变的,允许特定数字或所有数字:

WHERE ProductTheme.ProductID LIKE '%'

我得到重复: 在此处输入图像描述

我该如何解决?

编辑:表格的样本数据:

主题表:

在此处输入图像描述

产品表:

在此处输入图像描述

产品主题表:

在此处输入图像描述

4

1 回答 1

1

我想到的最快解决方法是DISTINCT在 SELECT 之后插入一个子句,例如

SELECT DISTINCT [Theme].[Name], [ThemeType].[Type] 
FROM [Theme] 
LEFT OUTER JOIN [ThemeType] 
ON [Theme].[ThemeTypeId] = [ThemeType].[PK_ThemeType]
JOIN [ProductTheme]
ON [ProductTheme].[ThemeId]=[Theme].[PK_Theme]
WHERE ProductTheme.ProductID LIKE '%' AND ProductTheme.ThemeId = Theme.PK_Theme AND COALESCE([THEME].[THEMETYPEID], 'null') LIKE '%[0-9]%' 
ORDER  BY CASE WHEN [THEMETYPE].[TYPE] IS NULL 
THEN 0 
ELSE 1 
END, 
[THEMETYPE].[TYPE]

我没有测试它,但从你的输出来看它应该可以工作。

于 2013-07-29T15:29:23.847 回答