2017-08-29 4 views
0

Sag mal, habe ich eine Tabelle, die wie folgt aussieht:Access VBA: Wählen Sie nur mehrere Werte

ID | PNo | MM | CP | 
---|-----|------|----| 
1 | 13 | True | 4 | 
2 | 92 | True | 3 | 
3 | 1 | True | 3 | 
4 | 13 | False| 2 | 
5 | 13 | True | 3 | 
6 | 1 | True | 3 | 

Ich will durch alle PNos gehen und alle Zeilen mit diesem PNr vergleichen und nur diejenigen auswählen, die unterschiedliche Werte haben im Feld MM.

Mein Plan war es, eine Tabelle mit den verschiedenen Werten von PNo zu erstellen, diese Tabelle mit dem üblichen Datensatz zu durchlaufen und eine SQL-Abfrage für jede PNo zu schreiben. Jetzt ist mein Problem die Konstruktion der SQL-Abfrage.

Ich kann alle Zeilen mit Table.Pno = rs ("PNo") auswählen, aber ich habe keine Ahnung, wie die Abfrage formuliert wird, um die Zeilen mit unterschiedlichen Werten abzufangen.

+0

nicht sicher, was du meinst. Gehe durch jede 'PNo' - also das sind 1, 13 und 92. Wähle diejenigen aus, die unterschiedliche Werte in' MM' haben - MM ist TRUE/FALSE. Also hat 1 nur TRUE, also nichts anzeigen, da nichts von diesem Wert abweicht? 92 hat 1 Datensatz, also unterscheidet sich nichts von diesem Wert? 13 hat TRUE und FALSE - da ein Boolean nur TRUE und FALSE haben kann, wird sich auch nichts davon unterscheiden. Also eine leere Tabelle anzeigen? –

+0

Sorry, es war wahrscheinlich nicht sehr klar. Ich möchte Zeilen mit der ID 1, 4, 5 auswählen, da sie zwei unterschiedliche Werte in MM haben: True und False. Ich möchte die Zeilen mit der ID 3, 6 nicht haben, da sie nur True als Wert in MM haben. – nvrslnc

Antwort

0

I denke, sollte dies funktionieren.

Dadurch wird ein kartesisches Produkt in Ihrem PNo-Feld erstellt. d. h. jeder Datensatz ist mit jedem Datensatz verbunden (aber nur mit dieser PNo).

SELECT * 
FROM Table1 T1 INNER JOIN Table1 T2 ON T1.PNo = T2.PNo 

Sie werden am mit 9 Fällen von PNr Ende 13, 4 von 1 und 1 von 92. Jetzt wollen wir nur diejenigen abzuschieben, in dem MM unterschiedlich ist, so hinzufügen, dass zu der WHERE-Klausel.

SELECT * 
FROM Table1 T1 INNER JOIN Table1 T2 ON T1.PNo = T2.PNo 
WHERE T1.MM <> T2.MM 
ORDER BY T1.ID 

Dies wird vier Datensätze zurückgeben. PNo 1 und 92 werden verschwunden sein, da das MM-Ergebnis für diese gleich ist. ID Nummer 4 wird zweimal zurückgegeben werden, wie der MM Wert von derjenigen unterscheidet, im ID-1 und ID 5.

den doppelten Wert löschen Sie dann DISTINCT verwenden:

SELECT DISTINCT T1.ID, T1.PNo, T1.MM, T1.CP 
FROM   Table1 T1 INNER JOIN Table1 T2 ON T1.PNo = T2.PNo 
WHERE   T1.MM <> T2.MM 
ORDER BY  T1.ID 

Hinweis: Einer Der Unterschied zwischen der Antwort von @ Jonathan und meiner ist, dass seine Abfrage aktualisierbar ist und meine nicht.

0

Folgendes sollte das tun, was Sie wollen:

SELECT * FROM MyTable WHERE PNo in 
(SELECT t.PNo FROM MyTable t 
INNER join MyTable f 
ON t.PNo = f.PNo 
WHERE t.MM = true and f.MM = false) 

Der innere sorgt kommen, dass nur diejenigen PNos, die sowohl MM falsch und MM wahr haben sind enthalten.

1

können Sie eine Unterabfrage verwenden:

Select * 
From YourTable 
Where PNo IN 
    (Select T.PNo 
    From YourTable   
    Group By PNo, MM 
    Having Count(*) = 2)