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)
Jak widać, powtarzam to samo podzapytanie, aby uzyskać kolejną kolumnę. Zastanawiam się, czy jest na to lepszy sposób?
id jest kluczem podstawowym w obu tabelach. Nie mam problemu z unikaniem product_special.priority, jeśli to może pomóc.
cross apply
jest dostępny w Postgres od wersji 9.3 (wydanej w 2013 r.), ale zdecydowali się przestrzegać standardu SQL i użyć standardowegolateral
operatora. W swoim drugim zapytaniu zastąpićleft join
zleft join lateral
Spróbuj wykonać następujące polecenie SQL:
źródło
LIMIT
DBMS i nie jest oznaczony (więc może to być MySQL lub Postgres lub SQLite lub ewentualnie inne dbms). Kod w zastosowaniach odpowiedziamiOUTER APPLY
iTOP
tak to będzie działać tylko w SQL Server (i Sybase), które nie mająLIMIT
.OUTER APPLY
, ale istnieje PÓŹNIEJ , które powinny być równoważne. Przykład z wykorzystaniem: stackoverflow.com/a/47926042/4850646Zainspirowany odpowiedzią dezso /dba//a/222471/127433 Rozwiązuję problem w PostgreSQL przy użyciu tablic:
Wprawdzie to wciąż tylko jedna kolumna, ale w moim kodzie mogę łatwo uzyskać dostęp do dwóch wartości. Mam nadzieję, że to również dla ciebie działa.
źródło
Chcę po prostu umieścić to tutaj w ostateczności, dla każdego, kto korzysta z silnika bazy danych, który nie obsługuje jednej lub więcej innych odpowiedzi ...
Możesz użyć czegoś takiego jak:
(Z separatorem lub formatowaniem col1 i col2 do określonej długości.) A później narysuj dane za pomocą podłańcuchów.
Mam nadzieję, że ktoś uzna to za przydatne.
źródło
W DB2 for z / OS użyj
pack
iunpack
funkcji, aby zwrócić wiele kolumn w podselekcji.źródło