SELECT
*,
p.name AS name,
p.image,
p.price,
(
SELECT ps.price
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS special_price,
(
SELECT ps.date
FROM product_special ps
WHERE p.id = ps.id
AND ps.date < NOW()
ORDER BY ps.priority ASC, LIMIT 1
) AS date
FROM product p LEFT JOIN product_special ps ON (p.id = ps.id)
Wie Sie sehen, wiederhole ich dieselbe Unterabfrage, nur um eine weitere Spalte herauszubekommen. Ich frage mich, gibt es einen besseren Weg, dies zu tun?
id ist der Primärschlüssel in beiden Tabellen. Ich habe kein Problem damit, product_special.priority einzigartig zu machen, wenn das helfen kann.
cross apply
ist in Postgres ab Version 9.3 (Veröffentlichung 2013) verfügbar, sie haben sich jedoch dafür entschieden, den SQL-Standard einzuhalten und den Standardoperator zu verwendenlateral
. Ersetzen Sie in Ihrer zweiten Abfrageleft join
mitleft join lateral
Versuchen Sie den folgenden SQL-Befehl:
quelle
LIMIT
und ist nicht mit einem DBMS versehen (es kann sich also um MySQL oder Postgres oder SQLite oder möglicherweise um ein anderes DBMS handeln). Der Code in der Antwort verwendetOUTER APPLY
undTOP
so funktioniert es nur in SQL Server (und Sybase), die nicht habenLIMIT
.OUTER APPLY
, aber es gibt LATERAL , was äquivalent sein sollte. Ein Beispiel dafür: stackoverflow.com/a/47926042/4850646Inspiriert von der Antwort von dezso /dba//a/222471/127433. Ich löse das Problem in PostgreSQL mithilfe von Arrays wie folgt :
Es ist zwar immer noch nur eine Spalte, aber in meinem Code kann ich problemlos auf die beiden Werte zugreifen. Hoffe, es funktioniert auch für Sie.
quelle
Ich möchte dies hier nur als letztes Mittel anführen, für alle, die eine Datenbank-Engine verwenden, die eine oder mehrere der anderen Antworten nicht unterstützt ...
Sie können etwas verwenden wie:
(Mit Trennzeichen oder Formatieren von Spalte 1 und Spalte 2 auf eine bestimmte Länge.) Zeichnen Sie Ihre Daten später mithilfe von Unterzeichenfolgen.
Ich hoffe, jemand findet es nützlich.
quelle
Verwenden Sie
pack
und in DB2 für z / OS,unpack
um mehrere Spalten in einer Unterauswahl zurückzugeben.quelle