Nhìn qua, bạn muốn tạo một đầu ra liệt kê 5 xe điện đi từ một số nhà ga đến Quảng trường Thành phố và 5 xe điện đi từ Quảng trường Thành phố đến một số nhà ga khác. Trong trường hợp này - bạn không thực hiện bất kỳ kết nối nào (ví dụ:đúng giờ) giữa hai điều này - bạn nên kết hợp trên một cột giả, row_number() OVER ()
nghĩ đến:
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);
Trong mỗi truy vấn phụ, bạn chọn năm hàng quan tâm. Vì không có thuộc tính rõ ràng nào nên bạn có thể JOIN
trên hai tập hợp hàng này, bạn phải tạo một số cột giả có thể phục vụ mục đích đó (bạn cần một cái gì đó để nối hoặc bạn sẽ nhận được CROSS JOIN
dẫn đến 5 x 5 hàng trong đầu ra). Sử dụng row_number() OVER () AS rn
thực hiện điều đó:nó tạo một cột mới với bí danh rn
chứa số hàng trên toàn bộ tập hợp hàng (OVER ()
, 5 hàng vì LIMIT
mệnh đề). Bạn thực hiện việc này trong cả hai truy vấn phụ để có thể sử dụng nó làm điều kiện kết hợp:USING (rn)
. Bạn không cần phải sử dụng cột này trong đầu ra.
Bạn không có quyền kiểm soát 5 thời gian xe điện nào sẽ được liệt kê. Nếu bạn muốn điều đó, bạn nên làm điều gì đó như WHERE dt1 > CURRENT_TIME
và ORDER BY dt1
trong cả hai truy vấn phụ hoặc một cái gì đó dọc theo dòng đó.