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)
Como puede ver, estoy repitiendo la misma subconsulta solo para obtener otra columna. Me pregunto si hay una mejor manera de hacer esto.
id es la clave principal en ambas tablas. No tengo ningún problema para que product_special.priority sea único si eso puede ayudar.
cross apply
está disponible en Postgres a partir de 9.3 (lanzado en 2013) pero eligieron adherirse al estándar SQL y usar ellateral
operador estándar . En su segunda consulta, reemplaceleft join
conleft join lateral
Pruebe el siguiente comando SQL:
fuente
LIMIT
y no está etiquetado con un DBMS (por lo que podría ser MySQL o Postgres o SQLite o posiblemente algún otro dbms). El código en la respuesta usaOUTER APPLY
y,TOP
por lo tanto, funcionará solo en SQL Server (y Sybase) que no tieneLIMIT
.OUTER APPLY
, pero existe LATERAL , que debería ser equivalente. Un ejemplo de uso: stackoverflow.com/a/47926042/4850646Inspirado por la respuesta de dezso /dba//a/222471/127433 Estoy resolviendo el problema en PostgreSQL usando matrices, así:
Es cierto que todavía es solo una columna, pero en mi código, puedo acceder fácilmente a los dos valores. Espero que funcione para ti también.
fuente
Solo quiero poner esto aquí como último recurso, para todos los que usan un motor de base de datos que no admite una o más de las otras respuestas ...
Puedes usar algo como:
(Con separador, o formateando col1 y col2 a una longitud específica). Y luego dibuje sus datos usando subcadenas.
Espero que alguien lo encuentre útil.
fuente
En DB2 para z / OS, use
pack
yunpack
funciones para devolver múltiples columnas en una subselección.fuente