MYSQl-Abfrage: zwei Bedingungen auf unterschiedliche Zeilen anwenden und verknüpfen



  • Nach dem die Suche im Web kein brauchbares Ergebnis gebracht hat poste ich meine Frage einfach mal hier:

    Ich habe eine Tabelle mit den Spalten var1 und var2. Hier besteht der erste Teil einer Abfrage darin, eine Position zu finden, an der var1 einen bestimmten Wert hat. So weit so simpel. Jetzt möchte ich aber gleichfalls wissen, ob der Wert von var2 an dieser Position noch mal an einer anderen Stelle als var1 vorkommt und dort var2 den gleichen Wert wie var1 hat (also ob es die gleiche Wertekombination noch mal in umgekehrter Reihenfolge gibt) - erst wenn dem nicht so ist möchte ich var1 als Ergebnis geliefert bekommen.

    Um das mal zu veranschaulichen:

    var1  var2 
      1     2 
      2     1 
      3     2
    

    Wenn var1 = 1 ist, so ist für den ersten Teil der Abfrage var2 = 2. Da aber gleichzeitig eine Spalte var1=2 und var2=1 existiert, soll die Abfragebedingung hier eben nicht erfüllt sein.

    Anders für die Abfrage des Wertes für var1=3: var2 ist hier 2, es existiert aber keine andere Zeile in der var1=2 und var2=3 ist, also ist die Bedinung erfüllt und ich möchte den Wert 2 zurückgeliefert bekommen.

    Meine Frage nun: geht sowas in einem einzigen SQL-Statement?

    Thx



  • Wenn jedes Var1 eindeutig ist, könnte das hier funktionieren.

    SELECT	var2
    FROM	tab a
    WHERE	var1 = 1
    AND	not exists (
    	SELECT	1
    	FROM	tab b INNER JOIN a ON a.var1 = b.var1 and a.var2 = b.var2
    	WHERE	var2 = 1
    	AND	var1 = (SELECT	var2
    			FROM	tab a
    			WHERE	var1 = 1 ))
    


  • var1 kann mehrfach vorkommen, allerdings mit immer anderen var2-Partnern. Gleiche var1-var2-Kombinationen sind ausgeschlossen.



  • Glaube nicht, dass Du das mit einem Statement hinkriegst.



  • Mit einem Self-join geht das

    select t1.var1, t1.var2
      from tab t1
      join tab t2
        on t1.var1 = t2.var2
       and t1.var2 = t2.var1
    

    Ungetestet und ohne Garantie.

    Tntnet


Anmelden zum Antworten