2014-10-04 68 views
0

我是新来的sql,有没有一种更好的方式或更有效的方式来编写我写的以下查询。我试图通过recipe id来拉取所有配方类别,如果它们是联结表中recipe id的记录,它应该返回true,否则返回false。有没有更有效的写这个存储过程的方法?

这里是预期的输出一个配方ID的截图,你看怎么有些人IsTagged真,其他都是假的

ScreenShot

SELECT Name AS TagName, Id AS TagID, 'false' AS IsTagged 
FROM dbo.Category 

EXCEPT 

SELECT category.Name AS TagName, category.ID AS TagID, 'false' AS IsTagged 
FROM dbo.Category AS category 
LEFT OUTER JOIN dbo.RecipeCategoryJunction AS junction 
    ON junction.CategoryID = category.Id 
LEFT OUTER JOIN dbo.Recipes AS recipe 
    ON recipe.Id = junction.RecipeId 
WHERE recipe.Id = 1019 

UNION 

SELECT category.Name AS TagName, category.ID AS TagID, 'true' AS IsTagged 
FROM dbo.Category AS category 
LEFT OUTER JOIN dbo.RecipeCategoryJunction AS junction 
    ON junction.CategoryID = category.Id 
LEFT OUTER JOIN dbo.Recipes AS recipe 
    ON recipe.Id = junction.RecipeId 
WHERE recipe.Id = 1019 
+3

你为什么在字符串文字和列别名中使用单引号?你不觉得困惑,难以阅读吗? – 2014-10-04 19:53:09

+2

我不觉得难以阅读 – Madhatter5501 2014-10-04 20:00:50

+3

太棒了。你的读者呢?那些必须继承你的代码的可怜人呢?我发现很难阅读和反向工程,而且我真的怀疑我是一个人。根本不需要这些列别名的分隔符。另外,像a,b和c这样的表别名如果与表格没有关系,就很愚蠢。 'Category' ='a'和'Recipes' ='c'?真? – 2014-10-04 20:03:44

回答

1

您可以用左独自做到这一点加入。

SELECT C.Name AS TagName, 
     C.Id AS TagID, 
     (CASE WHEN junction.CategoryID is NULL then 'False' Else 'True') AS IsTagged 
FROM dbo.Category C 
LEFT JOIN dbo.RecipeCategoryJunction AS junction 
    ON junction.CategoryID = category.Id 
    junction.RecipeId =1019 
相关问题