SELECT查询无意中重复行

时间:2013-07-29 15:23:04

标签: sql sql-server

我正在学习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

enter image description here

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

WHERE ProductTheme.ProductID LIKE '%'

我正在重复: enter image description here

我该如何解决这个问题?

编辑:表格的示例数据:

主题表:

enter image description here

产品表:

enter image description here

产品主题表:

enter image description here

1 个答案:

答案 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]

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