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)
Comme vous pouvez le voir, je répète la même sous-requête juste pour extraire une autre colonne. Je me demande s'il existe une meilleure façon de procéder?
id est la clé primaire dans les deux tables. Je n'ai aucun problème à rendre product_special.priority unique si cela peut aider.
cross apply
est disponible dans Postgres à partir de la version 9.3 (sortie en 2013) mais ils ont choisi d'adhérer au standard SQL et d'utiliser l'lateral
opérateur standard . Dans votre deuxième requête, remplacezleft join
parleft join lateral
Essayez la commande SQL suivante:
la source
LIMIT
et n'est pas étiqueté avec un SGBD (il pourrait donc s'agir de MySQL ou Postgres ou SQLite ou éventuellement d'autres dbms). Le code dans la réponse utiliseOUTER APPLY
etTOP
donc il ne fonctionnera que dans SQL Server (et Sybase) qui n'en ont pasLIMIT
.OUTER APPLY
, mais il y a LATÉRAL , qui devrait être équivalent. Un exemple en l'utilisant: stackoverflow.com/a/47926042/4850646Inspiré par la réponse de dezso /dba//a/222471/127433 Je résous le problème dans PostgreSQL en utilisant des tableaux, comme ceci:
Certes, ce n'est encore qu'une colonne, mais dans mon code, je peux facilement accéder aux deux valeurs. J'espère que cela fonctionne aussi pour vous.
la source
Je veux juste mettre cela ici en dernier recours, pour tous ceux qui utilisent un moteur de base de données qui ne prend pas en charge une ou plusieurs des autres réponses ...
Vous pouvez utiliser quelque chose comme:
(Avec séparateur, ou formatage col1 et col2 à une longueur spécifique.) Et dessinez ensuite vos données à l'aide de sous-chaînes.
J'espère que quelqu'un le trouvera utile.
la source
Dans DB2 pour z / OS, utilisez
pack
etunpack
fonctions pour renvoyer plusieurs colonnes dans une sous-sélection.la source