所以情況是我有 3 個表,其中 2 個是“幫助”表,而另一個是我試圖從中獲取不同 ID 的主表:
主表 dbo.recipes 具有列 ID、名稱和其他一些列,例如:
ID NAME
5 Veggie Cassola
6 Mozzarella Penne
7 Wiener Schnitzel with Fries
8 Grilled Salmon with Rice
9 Greek style Salad
助手是 dbo.stock:
ID_USER ID_INGREDIENT
1 225
1 585
1 607
1 643
1 763
1 874
1 937
1 959
1 960
2 225
2 246
2 331
2 363
2 511
2 585
和 dbo.content:
ID_INGREDIENT ID_RECIPE
98 5
196 5
333 5
607 5
608 5
613 5
627 5
643 5
763 5
874 5
951 5
956 5
225 6
585 6
607 6
基本上 dbo.stock 是用戶擁有的成分清單,因此是用戶 ID 和成分 ID。dbo.content 是制作某道菜所需的配料。
我要查詢的只是用戶實際擁有配料的食譜,這意味著所有配料都匹配(給某個用戶)的食譜應該回傳。我目前的程式代碼如下:
SELECT * FROM [dbo].[recipe]
WHERE [recipe].[id] NOT IN
(SELECT DISTINCT [content].[id_recipe] FROM [dbo].[content]
WHERE [content].[id_ingredient] NOT IN
(SELECT [stock].[id_ingredient] FROM [dbo].[stock]
WHERE [stock].[id_user] = @userID))
哪個有效,但我懷疑這是實作這一目標的最佳方式。有沒有更好的方法來達到同樣的效果?
微軟 SQL 服務器速成版 2019
uj5u.com熱心網友回復:
基本上,您想找到所有沒有庫存的成分的食譜。這不是您用英語思考的方式,但如果您在 SQL 中這樣思考,就會導致這種情況:
DECLARE @userID int = 1;
SELECT ID, NAME
FROM dbo.recipe AS r
WHERE NOT EXISTS
(
SELECT id_ingredient FROM dbo.content WHERE id_recipe = r.ID
EXCEPT
SELECT id_ingredient FROM dbo.stock WHERE id_user = @userID
);
然而,這個查詢更符合你的思路,只是沒有在DISTINCT上述兩個計劃中發現昂貴的 s (EXCEPT就像那樣偷偷摸摸),所以可能是最好的選擇:
DECLARE @userID int = 1;
SELECT ID, NAME
FROM dbo.recipe AS r
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.content AS c
WHERE id_recipe = r.ID AND NOT EXISTS
(
SELECT 1 FROM dbo.stock
WHERE id_ingredient = c.id_ingredient
AND id_user = @userID
)
);
- 示例db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411041.html
標籤:
下一篇:洗掉命令會洗掉乍一看不應該的行
