我正在学习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 '%'
我正在重复:
我该如何解决这个问题?
编辑:表格的示例数据:
主题表:
产品表:
产品主题表:
答案 0 :(得分:1)
我想到的最快的解决方法就是在SELECT之后插入一个DISTINCT
子句,如
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]
我没有测试它,但从你的输出判断它应该可以工作。