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 você pode ver, estou repetindo a mesma subconsulta apenas para obter outra coluna. Gostaria de saber se existe uma maneira melhor de fazer isso?
id é a chave primária nas duas tabelas. Não tenho problema em tornar o product_special.priority exclusivo, se isso puder ajudar.
cross apply
está disponível no Postgres começando com 9.3 (lançado em 2013), mas eles optaram por aderir ao padrão SQL e usar olateral
operador padrão . Em sua segunda consulta substituirleft join
comleft join lateral
Tente o seguinte comando SQL:
fonte
LIMIT
e não está marcado com um DBMS (portanto, pode ser MySQL ou Postgres ou SQLite ou possivelmente outros dbms). O código na resposta usaOUTER APPLY
e,TOP
portanto, ele funciona apenas no SQL Server (e Sybase) que não possuiLIMIT
.OUTER APPLY
, mas existe o LATERAL , que deve ser equivalente. Um exemplo de usá-lo: stackoverflow.com/a/47926042/4850646Inspirado pela resposta da dezso /dba//a/222471/127433 Estou resolvendo o problema no PostgreSQL usando matrizes, assim:
É certo que ainda é apenas uma coluna, mas no meu código, eu posso acessar facilmente os dois valores. Espero que funcione para você também.
fonte
Eu só quero colocar isso aqui como último recurso, para todos que usam o mecanismo de banco de dados que não suporta uma ou mais das outras respostas ...
Você pode usar algo como:
(Com separador ou formatando col1 e col2 para um comprimento específico.) E depois desenhe seus dados usando sub-strings.
Espero que alguém ache útil.
fonte
No DB2 para z / OS, use
pack
eunpack
funções para retornar várias colunas em uma subseleção.fonte