簡體   English   中英

如何避免對我的查詢使用子查詢?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM