我有两个表,加上一个匹配表。为了论证的缘故,我们称之为食谱和配料。每个食谱应该至少有一种成分,但可能有很多。每种成分都可以用于许多食谱。根据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 –