2017-04-16 7 views
0

Ich habe zwei Tabellen die erste Tabelle GroceryStores wie dieseWie vermeidet man die Verwendung einer Unterabfrage für meine Abfrage?

GsName | OrganizationId 
----------------------- 
'Olymp'| 1 
'Carul'| 2 
'Caref'| 3 
'Viveo'| 2 
'Suces'| 4 

Die zweite Tabelle Organisationen wie folgt aussieht

Id | Code | ParentOrganizationId 
-------------------------------- 
1 | 'AB' | 0 
2 | 'CD' | 3 
3 | 'EF' | 4 
4 | 'GH' | 0 

Wo GroceryStores.OrganizationId und Organizations.Id sind gleich aussieht.

Die Abfrage soll alle GsName zurückgeben, die eine bestimmte OrganizationId und seine jeweilige ParentOrganisation entsprechen.

Ich habe diese Abfrage versucht, aber es funktioniert nur, wenn ein GroceryStore nur zu einer Organisation gehört, aber ein GroceryStore kann eine ParentOrganization und eine GrandparentOrganization haben und verschiedene GroceryStores können derselben Organisation angehören. Auch kann man GroceryStore zu einer Organisation gehören, und dass Organisation möglicherweise nicht über eine 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

> Meine Abfrage schlägt fehl, wenn die Unterabfrage mehr als einen GsName zurückgibt. basierend auf den angegebenen Daten sollte es nicht fehlschlagen, da es nur eine einzige parentorganizationId geben würde. Können Sie die von Ihnen gesuchte Ausgabe anzeigen? Meine Vermutung ist, dass Sie die Hierarchie durchqueren und alle Lebensmittelgeschäfte anzeigen möchten – ughai

+0

Es fehlgeschlagen mit dem Fehler 'Unterabfrage zurückgegeben mehr als einen Wert', wenn ich die Unterabfrage ParentOrganisationId = @Organization hatte, aber ich habe es in dieser Frage behoben. Aber ich bekomme immer noch nicht das Ergebnis, nach dem ich suche. Wenn ich also eine variable Organisation deklariere und ihr den Wert 2 gebe, sollte die Abfrage 'Carul', 'Viveo', 'Caref' und 'Suces' zurückgeben. – AleAng

+0

verwendest du SQL Server? – ughai

Antwort

0

Warum versuchen Sie nicht, IN anstelle von EQUAL, wenn Sie EQUAL sagen, Sie müssen sicherstellen, dass Unterabfrage gibt nur 1 Zeile , dass Sie tun können, wenn Sie mit dem LIMIT 1 in der Abfrage

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

wünschen Da Sie die übergeordnete Hierarchie zu durchqueren müssen, verwenden Sie recursive CTE wie folgt aus:

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

Um zu verhindern, dass Ihre Abfrage während der Ausführung fehlschlägt, ändern Sie Ihre Abfrage in diese, Beachten Sie, dass ich = durch IN ersetzt habe.

SELECT GsName 
FROM GroceryStores INNER JOIN Organizations 
ON ParentOrganizationId = Id 
WHERE OrganizationId = @Organization 
OR WHERE OrganizationId IN (SELECT ParentOrganizationId FROM Organizations 
WHERE Id = @Organization) 
Verwandte Themen