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)
Seperti yang Anda lihat, saya mengulangi subquery yang sama hanya untuk mengeluarkan kolom lain. Saya bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini?
id adalah kunci utama di kedua tabel. Saya tidak punya masalah membuat product_special.priority unik jika itu dapat membantu.
cross apply
adalah tersedia di Postgres dimulai dengan 9,3 (dirilis pada 2013) tetapi mereka memilih untuk mematuhi standar SQL dan menggunakan standarlateral
operator. Dalam kueri kedua Anda gantileft join
denganleft join lateral
Coba perintah SQL berikut:
sumber
LIMIT
dan tidak ditandai dengan DBMS (sehingga bisa berupa MySQL atau Postgres atau SQLite atau mungkin beberapa dbms lainnya). Kode dalam jawaban menggunakanOUTER APPLY
danTOP
itu hanya akan bekerja di SQL Server (dan Sybase) yang tidak memilikiLIMIT
.OUTER APPLY
, tetapi ada LATERAL , yang harus setara. Contoh menggunakannya: stackoverflow.com/a/47926042/4850646Terinspirasi oleh jawaban dezso /dba//a/222471/127433 Saya sedang memecahkan masalah di PostgreSQL menggunakan array, seperti ini:
Memang itu masih hanya satu kolom, tetapi dalam kode saya, saya dapat dengan mudah mengakses dua nilai. Semoga berhasil juga untuk Anda.
sumber
Saya hanya ingin meletakkan ini di sini sebagai pilihan terakhir, untuk semua orang yang menggunakan mesin database yang tidak mendukung satu atau lebih dari jawaban lain ...
Anda dapat menggunakan sesuatu seperti:
(Dengan pemisah, atau memformat col1 dan col2 dengan panjang tertentu.) Dan kemudian menggambar data Anda menggunakan sub-string.
Saya harap seseorang menemukannya bermanfaat.
sumber
Dalam DB2 untuk z / OS, gunakan
pack
danunpack
fungsinya untuk mengembalikan beberapa kolom dalam sebuah subselect.sumber