我有兩個表,加上一個匹配表。爲了論證的緣故,我們稱之爲食譜和配料。每個食譜應該至少有一種成分,但可能有很多。每種成分都可以用於許多食譜。根據T-SQL中多個相關記錄的排序順序排列記錄?
Recipes Ingredients Match
=============== =============== ===============
ID int ID int RecipeID int
Name varchar Name varchar IngredientID int
的樣本數據:
Recipes Ingredients Match (shown as CDL but stored as above)
=============== =============== ===============
Soup Chicken Soup: Chicken, Tomatoes
Pizza Tomatoes Pizza: Cheese, Chicken, Tomatoes
Chicken Sandwich Cheese C. Sandwich: Bread, Chicken, Tomatoes
Turkey Sandwich Bread T. Sandwich: Bread, Cheese, Tomatoes, Turkey
Turkey
這裏是問題:我需要根據自己成分的姓名(或名稱)來排序食譜。鑑於上述樣本數據,我需要的食譜此排序順序:
Turkey Sandwich (First ingredient bread, then cheese)
Chicken Sandwich (First ingredient bread, then chicken)
Pizza (First ingredient cheese)
Soup (First ingredient chicken)
由第一成分排名的食譜很簡單:
WITH recipesranked AS (
SELECT Recipes.ID, Recipes.Name, Recipes.Description,
ROW_NUMBER() OVER (ORDER BY Ingredients.Name) AS SortOrder
FROM
Recipes
LEFT JOIN Match ON Match.RecipeID = Recipes.ID
LEFT JOIN Ingredients ON Ingredients.ID = Match.IngredientID
)
SELECT ID, Name, Description, MIN(SortOrder)
FROM recipesranked
GROUP BY ID, Name, Description;
除此之外,我卡住了。在我上面的例子中,這幾乎可以工作,但將兩個三明治留在模糊的順序中。
我有一種感覺,MIN(SortOrder)
應該被別的東西取代,也許是一個相關的子查詢,在同一個CTE中尋找不存在另一個記錄,但沒有弄清楚細節。
任何想法?
(有可能食譜有沒有成分。我不在乎他們來什麼樣的順序進行,但最終將是理想的。在這一點不是我的主要關注的問題。)
我m使用SQL Server 2008 R2。
更新:我增加了一個SQL搗鼓這一點,並在此更新的例子來匹配:
http://sqlfiddle.com/#!3/38258/2
更新:我有一個鬼鬼祟祟的懷疑,如果有一個解決方案,它涉及一個交叉連接來比較每個食譜/成分的每一個組合,然後以某種方式進行過濾。
任何機會,你可以在SQL小提琴上設置此? – UnhandledExcepSean
我並不真正追隨你想要達到的目標。 – DeadlyDan
您可以使用此解決方案作爲您的起點http://stackoverflow.com/questions/19209768/sql-split-function-and-ordering-issue/19209883#19209883 –