2010-03-17 36 views
12

Có thể thực hiện tương đương với LEFT JOIN với subselect trong đó có nhiều cột được yêu cầu. Đây là ý tôi.Sử dụng subselect để hoàn thành LEFT JOIN

SELECT m.*, (SELECT * FROM model WHERE id = m.id LIMIT 1) AS models FROM make m 

Vì nó hiện đang thực hiện điều này mang lại cho tôi lỗi 'Toán tử phải chứa 1 cột'.

Có Tôi biết điều này là có thể với LEFT JOIN, nhưng tôi đã nói rằng nó có thể với subselect để tôi tò mò như thế nào nó được thực hiện.

Trả lời

7

Một lựa chọn phụ chỉ có thể có một cột được trả về từ nó, vì vậy bạn sẽ cần một lựa chọn cho mỗi cột mà bạn muốn trả về từ bảng mô hình.

+0

tôi thực sự có thể trả về nhiều cột trong một subselect mặc dù không theo cách tôi muốn. Truy vấn này trả về nhiều cột. SELECT m. *, Models. * TỪ make m, (SELECT * FROM model LIMIT 1) AS mô hình – Andre

+1

Truy vấn phụ có thể trả về nhiều hơn một cột từ FROM và JOIN, vì bạn đang làm việc với các hàng trong ngữ cảnh đó. Vì bạn chỉ làm việc với vô hướng trong ngữ cảnh SELECT, bạn chỉ có thể trả lại một giá trị từ truy vấn phụ ở đó. – MisterZimbu

+0

Đồng ý. Cảm ơn bạn. – Andre

16

Có nhiều cách sử dụng thực tế cho những gì bạn đề xuất.

truy vấn giả thuyết này sẽ quay trở lại gần đây nhất release_date (ví dụ contrived) cho bất kỳ thực hiện với ít nhất một release_date, và null cho bất kỳ thực không có release_date:

SELECT m.make_name, 
     sub.max_release_date 
    FROM make m 
     LEFT JOIN 
      (SELECT id, 
        max(release_date) as max_release_date 
       FROM make 
      GROUP BY 1) sub 
     ON sub.id = m.id