2016-06-20 8 views
1

Ich versuche, nach Datensätzen zu suchen, die gemeinsame Beziehungen haben. Um unentgeltlichen Kontext zu vermeiden, hier ist ein hypothetisches Beispiel von meinem Lieblings-alten Schule Nintendo-Spiel:Wie frage ich nach Datensätzen, die alle die gleichen Beziehungen haben (MS Access)?

eine Tabelle von Boxer Bedenken Sie:

tableBoxers 
ID | boxerName 
---------------- 
1 | Little Mac 
2 | King Hippo 
3 | Von Kaiser 
4 | Don Flamenco 
5 | Bald Bull 

Jetzt habe ich eine Beziehungstabelle, die sie zusammen

Links
boxingMatches 
boxerID1 | boxerID2 
----------------------- 
1   | 3 
2   | 5 
2   | 4 
5   | 1 
4   | 1 

Da will ich nicht zwischen ID1 und ID2 unterscheiden, erstelle ich eine Abfrage, die UNIONs sie zusammen:

SELECT firstID AS boxerID1, secondID AS boxerID2 FROM 
(
    SELECT boxerID1 AS firstID, boxerID2 AS boxerID FROM boxingMatches 
    UNION ALL 
    SELECT boxerID2 AS firstID, boxerID1 AS secondID FROM boxingMatches 
) ORDER BY firstID, secondID 

ich:

queryBoxingMatches 
boxerID1 | boxerID2 
----------------------- 
1   | 3 
1   | 4 
1   | 5 
2   | 4 
2   | 5 
3   | 1 
4   | 1 
4   | 2 
5   | 1 
5   | 2 

Jetzt habe ich VBA-Skript, wo ein Benutzer die Boxer wählen kann er interessiert ist Lassen Sie uns sagen, dass er wenig Mac (1) und König Hippo (2) auswählt.. Dies wird in eine temporäre Tabelle angefügt:

summaryRequest 
boxerID 
-------- 
1 
2 

Tabellen- [summaryRequest] und [queryBoxingMatches], wie ich den kleinen Mac (1) und König Hippo (2) Sie herausfinden, haben sich gegen ähnlich gekämpft? Das Ergebnis sollte Bald Bull (5) und Don Flamenco (4) sein.

Bedenken Sie, dass [summaryRequest] 0 oder mehr Datensätze haben könnte. Ich habe ein INTERSECT in Betracht gezogen, aber ich bin mir nicht sicher, ob das die richtige Funktion dafür ist. Ich habe versucht, COUNT auf viele Arten zu verwenden, aber es gibt unerwünschte Daten, wenn es mehrere Beziehungen gibt (z. B. wenn Little Mac zweimal gegen Bald Bull kämpfte und King Hippo ihn nur einmal bekämpfte).

Ich kann nicht helfen, aber fühle mich wie die Antwort ist schlicht und einfach und ich überdenke es nur. Jede Hilfe wird geschätzt. Vielen Dank.

+0

'COUNT' klingt wirklich gut, was hast du damit versucht? – Bulat

Antwort

0

nicht sicher, ob das, wie dies in MS Access funktioniert:

SELECT boxerID2, COUNT(*) as cnt 
FROM queryBoxingMatches 
WHERE boxerID1 IN (SELECT boxerID FROM summaryRequest) 
GROUP BY boxerID2 
HAVING COUNT(DISTINCT boxerID1) = (SELECT COUNT(DISTINCT boxerID) 
            FROM summaryRequest) 
+1

Also, da die äußere Abfrage eine Aggregatfunktion hat, habe ich es mit GROUP BY boxerID2 versucht. – user2271875

+0

Aber ich habe immer noch das gleiche Problem. Wenn Little Mac zweimal gegen Bald Bull kämpft, dann erscheint boxerID 5 zweimal für Little Mac und wenn King Hippo einmal gegen Bald Bull kämpft, dann erscheint es einmal für King Hippo (dreimal in [queryBoxingMatches]). Und es gibt nur 2 Boxer (Little Mac und King Hippo) in [summaryRequest]; 3 <> 2. Das Nettoergebnis ist, dass Bald Bull in diesem Szenario nicht mehr erscheint. Wenn ich einen der doppelten Kämpfe zwischen Little Mac und Bald Bull lösche, dann 2 = 2 und es erscheint. – user2271875

+0

Zumindest konnten Sie es durch den Klang davon ausführen. Ich habe die Antwort mit "distinct" -Klausel aktualisiert. hoffe, es funktioniert in MA Access. – Bulat

0

Okay, ich glaube, ich die Antwort gefunden:

SELECT boxerID2 FROM 
(
    SELECT boxerID2, COUNT(boxerID2) AS getCount FROM queryBoxingMatches 
    WHERE boxerID1 IN (SELECT ID FROM summaryRequest) 
    GROUP BY boxerID2 
) 
WHERE getCount = (SELECT COUNT(*) FROM summaryRequest) 

Es ist ein Spiel aus der COUNT(), die ich don Mag nicht, weil COUNT() keine vollwertige Beziehung garantiert - nur ein Muster.

+0

Doh. Sobald ich zwei Duplikate hinzugefügt habe (z. B. Little Mac vs Bald Bull zweimal), wird die Zählung abgeschwächt und Bald Bull vollständig herausgefiltert. – user2271875

+0

Okay, ich habe die letzte Zeile in "WHERE VAL (getCount)> = ..." geändert. Das schien das Problem (vorerst) zu lösen. Ich habe das Gefühl, dass eine Inkonsistenz die Folge sein wird, aber ich denke, das wird reichen. – user2271875