Dari tampilannya, Anda ingin membuat output yang mencantumkan 5 trem yang berangkat dari beberapa stasiun ke Alun-Alun Kota dan 5 trem yang berangkat dari Alun-Alun Kota ke beberapa stasiun lain. Dalam hal ini - Anda tidak membuat koneksi apa pun (misalnya, tepat waktu) antara dua hal ini - Anda harus bergabung pada kolom semu, row_number() OVER ()
terlintas di pikiran:
SELECT '$name' AS name1, w1.time1, 'City Square - arrival' AS name2, w1.time2,
'City Square - departure' AS name3, w2.time3, '$name2' AS name4, w2.time4
FROM (
SELECT dt1.time AS time1, dt2.time AS time2, row_number() OVER () AS rn
FROM departure_times AS dt1
JOIN departure_times AS dt2 USING (tram_id)
WHERE dt1.name = '$name' AND dt2.name = 'CitySquare'
LIMIT 5) w1
JOIN (
SELECT dt1.time AS time3, dt2.time AS time4, row_number() OVER () AS rn
FROM departure_times AS dt1
JOIN departure_times AS dt2 USING (tram_id)
WHERE dt1.name = 'CitySquare' AND dt2.name = '$name2'
LIMIT 5) w2 USING (rn);
Di setiap sub-kueri, Anda memilih lima baris yang diinginkan. Karena tidak ada properti yang jelas, Anda dapat JOIN
dua set baris ini aktif, Anda harus membuat beberapa kolom semu yang dapat melayani tujuan itu (Anda memerlukan sesuatu untuk bergabung atau Anda akan mendapatkan CROSS JOIN
menghasilkan 5 x 5 baris dalam output). Menggunakan row_number() OVER () AS rn
melakukan hal itu:ia membuat kolom baru dengan alias rn
yang berisi nomor baris di seluruh rangkaian baris (OVER ()
, 5 baris karena LIMIT
ayat). Anda melakukan ini di kedua sub-kueri sehingga Anda dapat menggunakannya sebagai kondisi gabungan:USING (rn)
. Anda tidak harus menggunakan kolom ini di output.
Anda tidak memiliki kendali atas 5 waktu trem mana yang akan dicantumkan. Jika Anda menginginkannya, Anda harus melakukan sesuatu seperti WHERE dt1 > CURRENT_TIME
dan ORDER BY dt1
di kedua sub-kueri, atau sesuatu di sepanjang baris itu.