/ / Wie vereinfacht man diese Abfrage mit SQL-Joins? - sql, postgresql

Wie vereinfacht man diese Abfrage mit SQL-Joins? - sql, postgresql

my_table hat 4 Spalten: id integer, value integer, value2 integer, name character varying

Ich möchte alle Datensätze, die:

  1. haben den gleichen Wert2 wie ein Datensatz, dessen Name "a_name" ist
  2. einen Feldwert haben, der dem eines Datensatzes mit dem Namen "a_name" unterlegen ist

Und ich habe zufriedenstellende Ergebnisse mit der folgenden Abfrage:

select t.id
from my_table as t
where  t.value < ( select value from my_table where name = "a_name")
and s.value2 = (select value2 from my_table where name = "a_name");

Aber Ist es möglich, diese Abfrage mit SQL-Joins zu vereinfachen?

Es ist immer noch zu kompliziert, an einem Tisch mitzumischen. Und ich versuche mit diesem Beispiel zu verstehen.

Was ich bisher beim Versuch passiert habe, ist ein Ergebnis voller Doppelgänger:

select t2.id
from my_table as t
inner join my_table as t2 on t2.value2 = t.value2
where t2.value < ( select value from my_table where name = "a_name");

Antworten:

2 für die Antwort № 1

Ich denke, das wird dein Problem lösen.

select t1.id
from my_table as t1
join my_table as t2
on t1.value2 = t2.value2
and t2.name = "a_name"
and t1.value < t2.value

1 für die Antwort № 2

Sie sollten Self Join anstelle von Inner Join verwenden http://msdn.microsoft.com/en-us/library/ms177490%28v=sql.105%29.aspx


1 für die Antwort № 3

Sie können immer unterschiedliche Ergebnisse erhalten, indem Sie "SELECT distinct t2.id ..." aufrufen.

Das Verständnis der inneren Verbindungen wird dadurch jedoch nicht verbessert. Wenn Sie wollen, lesen Sie weiter. Beginnen wir mit dem Abrufen aller Datensätze mit name = "a_name".

SELECT a.*
FROM my_table as a
WHERE a.name = "a.name";

Ein einfacher Weg, um Ihre inneren Verknüpfungen auszuführen, besteht darin zu verstehen, dass das Ergebnis für die obige Abfrage eine weitere Tabelle ist, die formal als a bezeichnet wird Beziehung. Sie können sich das als eine Verknüpfung auf demselben Tisch vorstellen, aber eine einfachere Möglichkeit ist, "das Ergebnis dieser Abfrage zu verbinden". Lassen Sie uns dies auf die Probe stellen.

SELECT other.id
FROM my_table as a,
INNER JOIN my_table as other ON other.value2 = a.value2
WHERE a.name = "a_name"
AND other.value < a.value;

Wenn die erste Abfrage (alle Zeilen mit name ="a_name") hat viele Ergebnisse, Sie haben gute Chancen, dass die zweite Abfrage Duplikate hat, da der innere Join zwischen den Aliasnamen "a" und "other" eine Untermenge von deren ist Kreuzprodukt.

Bearbeitungen: Grammatik, Klarheit


0 für die Antwort № 4

Bitte versuchen Sie es

select t.id
from my_table as t
inner join
(select value from my_table where name = "a_name")t1 on t.value<t1.value
inner join
(select value2 from my_table where name = "a_name")t2 on t.value2=t2.value2