[英]How to avoid using a sub query for my query?
我有兩個表第一個表GroceryStores看起來像這樣
GsName | OrganizationId
-----------------------
'Olymp'| 1
'Carul'| 2
'Caref'| 3
'Viveo'| 2
'Suces'| 4
第二個表組織看起來像這樣
Id | Code | ParentOrganizationId
--------------------------------
1 | 'AB' | 0
2 | 'CD' | 3
3 | 'EF' | 4
4 | 'GH' | 0
其中GroceryStores.OrganizationId和Organizations.Id相同。
該查詢應該返回與給定OrganizationId及其各自的ParentOrganization匹配的所有GsName。
我已經嘗試過此查詢,但是僅當GroceryStore僅屬於一個組織但一個GroceryStore可以具有ParentOrganization和GrandparentOrganization並且不同的GroceryStores可以屬於同一組織時,該查詢才起作用。 同樣,一個GroceryStore可以屬於一個組織,並且該組織可能沒有上級組織
SELECT GsName
FROM GroceryStores INNER JOIN Organizations
ON ParentOrganizationId = Id
WHERE OrganizationId = @Organization
OR WHERE OrganizationId = (SELECT ParentOrganizationId FROM Organizations
WHERE Id = @Organization)
為什么不嘗試用IN代替EQUAL,當您說EQUAL時,必須確保SUBQUERY只返回1行,如果願意,可以在查詢中使用LIMIT 1
SELECT GsName
FROM GroceryStores INNER JOIN Organizations
ON ParentOrganizationId = Id
WHERE OrganizationId = @Organization
OR WHERE OrganizationId IN (SELECT ParentOrganizationId FROM Organizations
WHERE Id = @Organization)
由於您需要遍歷父層次結構,因此請使用遞歸CTE,如下所示:
WITH Org
AS
(
SELECT Id,ParentOrganizationId
FROM Organizations
WHERE Id = @Org
UNION ALL
SELECT O.Id,O.ParentOrganizationId
FROM Org O1
INNER JOIN Oranizations O
ON O1.ParentOrganizationId = O.Id
)
SELECT GsName
FROM GroceryStores
WHERE OrganizationId IN
(
SELECT Id FROM Org
)
為防止查詢在執行過程中失敗,請將查詢更改為此,請注意,我已將=
替換=
IN
。
SELECT GsName
FROM GroceryStores INNER JOIN Organizations
ON ParentOrganizationId = Id
WHERE OrganizationId = @Organization
OR WHERE OrganizationId IN (SELECT ParentOrganizationId FROM Organizations
WHERE Id = @Organization)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.