2014-10-04 54 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 
相關問題