SQL Wählen Sie nur Zeilen aus, in denen genau mehrere Beziehungen vorhanden sind

8

Dies steht in engem Zusammenhang mit dieser Frage , aber fügt eine weitere Anforderung hinzu.

Gegeben eine übergeordnete Tabelle 'Eltern'

%Vor%

und eine Viele-Viele-Beziehungstabelle 'rel' zwischen Eltern und einer (hier nicht näher bezeichneten) Eigenschaftentabelle

%Vor%

Wie kann ich alle Eltern auswählen, die alle und nur eine bestimmte Gruppe von Beziehungen haben? Z.B. Wie finde ich mit den Beispieldaten alle Eltern, die Beziehungen zu genau der Eigenschaft 5 und 1 haben?

    
Laizer 01.01.2013, 18:55
quelle

10 Antworten

8
%Vor%     
juergen d 01.01.2013, 19:00
quelle
3

Wenn Sie alle Eltern mit mindestens eine 5 und eine 1 auswählen möchten, können Sie verwenden:

%Vor%

Wenn Sie genau eine 5 und eine 1 benötigen, lesen Sie diese Antwort

    
Asad Saeeduddin 01.01.2013 19:09
quelle
2

Mit zwei verschachtelten Unterabfragen, wie diesem ..

%Vor%

Der erste liest "Zeigen Sie mir alle Eltern an, wo nicht eine Eigenschaft in der angegebenen Liste von Eigenschaften ist, die nicht in der übergeordneten Eigenschaftentabelle für das angegebene übergeordnete Element enthalten ist ...."

Die zweite Unterabfrage lautet: "Stellen Sie außerdem sicher, dass in der parentProperties-Tabelle für diesen übergeordneten Eintrag kein Eintrag für eine Eigenschaft vorhanden ist, die nicht in der angegebenen Liste ist."

    
Charles Bretana 01.01.2013 19:08
quelle
2
%Vor%

Damit werden alle PARENT_ID ausgewählt, die genau zwei Zeilen mit genau zwei nicht duplizierten PROP_ID haben, die übereinstimmen.

    
fthiella 01.01.2013 19:48
quelle
2

Diese Alternative hat den Vorteil einer konstanten Anweisungsstruktur und nur eines Parameters, unabhängig von der Anzahl der Beziehungen, nach denen Sie suchen:

%Vor%

Nachteile:

  • Sie müssen eine geordnete, kommagetrennte Zeichenfolge von prop_ids im Voraus vorbereiten.
  • Dies funktioniert bei MySQL, aber nicht bei allen Datenbankservern.
Lorem Ipsum 28.10.2015 19:40
quelle
1

Angenommen, (PARENT_ID, PROP_ID) ist eindeutig:

%Vor%

Oder

%Vor%

Oder sogar,

%Vor%     
lc. 01.01.2013 18:58
quelle
0

Wenn MySql minus unterstützt, könnte die Abfrage wie folgt aussehen:

%Vor%

Die not in wird diejenigen Beziehungen entfernen, die (5,1) überschreiten, z. (5,1,3).

Ich weiß, dass du MySql benutzt und meine Antwort ist daher falsch. Nimm es einfach als eine andere Idee.

    
sorencito 01.01.2013 20:57
quelle
0

Diese Abfrage ist auch dann wahr, wenn (PARENT_ID, PROP_ID) nicht eindeutig ist:

%Vor%     
Hajjari 03.03.2013 06:15
quelle
-1

Hoffe das wird dir helfen:

%Vor%     
gezimi005 01.01.2013 19:14
quelle
-3

Sie können dies mit einer Gruppe nach.

SELECT PARENT_ID Von link_tbl WO PROP_ID IN (5,1) GROUP BY PARENT_ID HABEN COUNT (*) = 2

    
user836087 01.01.2013 18:59
quelle

Tags und Links