Frage

Lassen Sie uns sagen, ich habe die folgende Tabelle:

ID | parentID | MoreStuff
1  | -1       |  ...
2  |  1       |  ...
3  |  1       |  ...
4  |  2       |  ...
5  |  1       |  ...

Wie kann ich generieren eine SQL-SELECT-Anweisung, wenn eine bestimmte Zeile Kinder hat, um herauszufinden? Mit anderen Worten, ich möchte wissen, ob ID 1 Kinder, die in diesem Fall hat es 3

Ich bin mir nicht sicher, wie die SQL-Anweisung zu erstellen:

SELECT ID, hasChildren FROM myTable;

Was für hasChildren in der obigen SQL-SELECT-Anweisung ersetzt werden würde?

War es hilfreich?

Lösung

Keine Gruppe Version:

SELECT MyTable.Id, CASE WHEN EXISTS 
    (SELECT TOP 1 1  --you can actually select anything you want here
     FROM MyTable MyTableCheck 
     WHERE MyTableCheck.ParentId = MyTable.Id
    ) THEN 1 ELSE 0 END AS HasRows
FROM MyTable

Andere Tipps

Sie Mitglied auf sich selbst um die Tabelle zu finden, wenn es Kinder hat:

SELECT 
    parent.id as ID
,   case when count(child.id) > 0 then 1 else 0 end as hasChildren 
FROM       myTable parent
LEFT JOIN  myTable child
ON         child.parentID = parent.ID
GROUP BY   parent.id

Wenn Sie wissen, kennen bereits die Eltern-ID, dann die Abfrage einfach -. Wählen Sie einfach die Anzahl der Zeilen mit diesem Elternteil ID

SELECT count(*) FROM myTable where parentID = 1;

Es gibt sehr gültige Antworten auf Ihre Frage, die funktionieren wird. Allerdings würde ich die Leistung einer solchen Abfrage prüfen, ob Ihre Datenmenge sehr groß ist.

Wenn Ihr eine Gruppe von oder Sub-Abfrage zu verwenden, gehen die Daten zu bekommen, dann stellen Sie sicher, sowohl die ID und Parent Spalten haben separate Indizes.

Um eine noch bessere Leistung, sollten Sie eine Spalte namens „HasChildren“ hinzufügen, die ein „Bit“ Datentyp sein könnte. Diese Spalte sollte dann von Anwendungscode aktualisiert werden, wenn Elemente eingefügt oder gelöscht. Dies würde ermöglicht es Ihnen, die viel schnelle Abfrage auszuführen:

SELECT * FROM table WHERE haschildren IS NOT NULL

Die oben genannten Lösungen sind in Ordnung, aber man sollte nicht Spalte wie ‚HasChildren‘ hinzufügen, wenn Sie wirklich ein Leistungsproblem haben (siehe den Beitrag von Gatekiller). Eine solche Säule denormalisiert die Datenbank, das heißt das gleiche Stück Information wird in zwei Orten gespeichert werden, was es wahrscheinlicher, dass Ihre Daten inkonsistent macht. Sie werden diese Spalte erhalten, wann immer Sie ein neues Kind einfügen, löschen Sie eine vorhandene oder die Eltern eines Kindes aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top