2017-04-16 99 views
0

我有两个表的第一个表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可以属于一个组织和该组织可能没有ParentOrganization

SELECT GsName 
FROM GroceryStores INNER JOIN Organizations 
ON ParentOrganizationId = Id 
WHERE OrganizationId = @Organization 
OR WHERE OrganizationId = (SELECT ParentOrganizationId FROM Organizations 
WHERE Id = @Organization) 
+0

>当子查询返回多个GsName时,我的查询失败。 根据给定的数据,它不应该失败,因为只会有一个parentorganizationId。你能展示你正在寻找的例外输出吗?我的猜测是你想遍历层次结构并显示所有杂货店 – ughai

+0

当我将子查询作为ParentOrganizationId = @Organization时,出现错误“子查询返回多个值”的错误,但我在此问题中修复了此错误。但我仍然没有得到我期待的结果。因此,如果我声明变量组织并将其值设为2,则查询应返回'Carul','Viveo','Caref'和'Suces' – AleAng

+0

是否使用SQL Server? – ughai

回答

0

你为什么不尝试,在地方平等的,当你说平等,你必须确保SUBQUERY只返回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) 
0

使用LIMIT 1想既然你需要遍历父层次,使用recursive 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 
) 
0

为防止您的查询在执行过程中失败,请将您的查询更改为此, 请注意,我已将=替换为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)