2017-02-06 2 views
0

Ich habe zwei Tabellen, Category und Member:SQL: Kombinieren Sie Kategorien und die Mitglieder in einer Auswahlausgang

Category:   Member: 
+--Id--+--Name--+ +--Id--+--Name--+--CategoryId--+ 
| 1 | Cat1 | | 1 | Mem1 | 2   | 
| 2 | Cat2 | | 2 | Mem2 | 2   | 
| 3 | Cat3 | | 3 | Mem3 | 1   | 
+------+--------+ | 4 | Mem4 | 3   | 
        | 5 | Mem5 | 1   | 
        | 6 | Mem6 | 3   | 
        +------+--------+--------------+ 

Ich möchte eine Abfrage haben, die die folgende Ausgabe gibt:

Combined: 
+--Name--+--IsCategory--+ 
| Cat1 | True  | 
| Mem3 | False  | 
| Mem5 | False  | 
| Cat2 | True  | 
| Mem1 | False  | 
| Mem2 | False  | 
| Cat3 | True  | 
| Mem4 | False  | 
| Mem6 | False  | 
+--------+--------------+ 

I weiß, wie man JOIN benutzt, um jedes Mitglied mit seinem Kategorienamen in einer Zeile auszugeben, und wie man UNION benutzt, um alle Kategorien und Mitglieder in einer Ausgabe aufzulisten. Kann ich eine Kombination dieser beiden Befehle verwenden, um die gewünschte Ausgabe zu erzielen? Oder muss ich irgendwie eine FOR EACH-Schleife machen? Ist es überhaupt möglich zu bekommen, was ich will?

EDIT: Die Bestellung Cat1, Mem3, Mem5, Cat2, Mem1, Mem2,... ist wichtig für mich.

Antwort

0

Basierend auf den Antworten von @Chanukya und @Zohar Peled Ich habe die folgende Lösung gefunden:

SELECT Name, IsCategory FROM 
    (SELECT Name as Name, 1 as IsCategory, id * 10000 as OrderNumber 
    FROM Category 
    UNION ALL 
    SELECT m.Name as Name, 0, c.id * 10000 + m.id as OrderNumber 
    FROM Members b JOIN Category c ON m.CategoryId = c.Id 
    ) AS temp 
ORDER BY OrderNumber; 

Dies setzt voraus, dass es nicht mehr als 10000 Mitglieder pro Kategorie gibt, was für meinen aktuellen Anwendungsfall in Ordnung ist. Ich freue mich jedoch über Vorschläge für einen eleganteren und korrekten Weg.

1

GERADE habe ich versucht, wie diese können u überprüfen Sie es

CREATE TABLE #Category 
    ([Id] int, [Name] varchar(4)) 

INSERT INTO #Category 
    ([Id], [Name]) 
VALUES 
    (1, 'Cat1'), 
    (2, 'Cat2'), 
    (3, 'Cat3') 

CREATE TABLE #Member 
    ([Id] int, [Name] varchar(4), [CategoryId] int) 
; 

INSERT INTO #Member 
    ([Id], [Name], [CategoryId]) 
VALUES 
    (1, 'Mem1', 2), 
    (2, 'Mem2', 2), 
    (3, 'Mem3', 1), 
    (4, 'Mem4', 3), 
    (5, 'Mem5', 1), 
    (6, 'Mem6', 3) 

SELECT NAME , CASE WHEN NAME LIKE'%CAT%' THEN 'TRUE' ELSE 'FALSE' END AS IS_CATEGORY FROM (SELECT * FROM #MEMBER UNION ALL 
SELECT *,NULL AS COLUMN1 FROM #CATEGORY)A 

Ausgang

NAME IS_CATEGORY 
Mem1 FALSE 
Mem2 FALSE 
Mem3 FALSE 
Mem4 FALSE 
Mem5 FALSE 
Mem6 FALSE 
Cat1 TRUE 
Cat2 TRUE 
Cat3 TRUE 
+0

Vielen Dank. Die Reihenfolge (Kategoriename, Mitgliedsnamen, Kategoriename, Mitgliedsnamen, ...) ist wichtig. Siehe die bearbeitete Antwort. –

+0

@Tell mir einen richtigen Grund, dass, wie diese Reihenfolge kommt, brauche ich Erklärung Cat1, Mem3, Mem5, Cat2, Mem1, Mem2 .. @ Michael Hilus – Chanukya

+0

Die Reihenfolge muss so sein: 'Cat1' ist die erste Kategorie gefolgt von all seine Mitglieder 'Mem3' und' Mem3'. 'Cat2' ist die zweite Kategorie gefolgt von seinen Mitgliedern' Mem1' und 'Mem2' und so weiter ... –

1

Sie Vereinigung für diese verwenden:

SELECT name, 0 as IsCategory 
FROM member 
UNION ALL 
SELECT name, 1 
FROM category 
+0

Danke für Ihre schnelle Antwort. Die Reihenfolge der Namen in der Ausgabe ist mir wichtig. Siehe die bearbeitete Antwort. –

Verwandte Themen