Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Nhận thêm hàng - Sau khi nối 3 bảng bằng cách sử dụng Nối trái

Khi bạn JOIN hai hoặc nhiều bảng cùng nhau, bạn sẽ có được một sản phẩm cacte hiệu quả cho các bảng này mà bộ lọc được nêu trong JOIN điều kiện được áp dụng.

Điều này rõ ràng hơn khi bạn sử dụng JOIN ngầm định đã lỗi thời cú pháp.

LEFT JOIN đảm bảo rằng bạn nhận được không ít hơn hàng hơn bảng ngoài cùng bên trái chứa, i. e. mỗi hàng từ bảng ngoài cùng bên trái được trả về ít nhất một lần.

Bạn vẫn có thể nhận được nhiều hàng hơn, nếu bộ lọc không phải là ánh xạ một hàng một.

Trong trường hợp của bạn:

SELECT  (b.descr || ' - ' || c.descr) description
FROM    tbl1 a
LEFT JOIN
        tbl2 b
ON      b.ACCOUNT = a.ACCOUNT
LEFT JOIN
        tbl3 c
ON      c.product = a.product
WHERE  a.descr50 = ' '

acccount hoặc product không phải là duy nhất trong b hoặc c .

Đối với các hàng này:

a.account

1
2
3

b.account  b.description

1          Account 1
2          Account 2 - old
2          Account 2 - new

, JOIN sẽ trả về như sau:

a.account b.account b.description

1         1          Account 1
2         2          Account 2 - old
2         2          Account 2 - new
3         NULL       NULL

, cung cấp cho bạn nhiều hàng hơn một trong hai bảng chứa.

Để chỉ chọn mô tả phù hợp đầu tiên từ một trong hai bảng, hãy sử dụng cái này:

SELECT  (
        SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
        FROM    tbl2 b
        WHERE   b.account = a.account
                AND rownum = 1
        ) || ' - ' ||
        (
        SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
        FROM    tbl3 c
        WHERE   c.product= a.product
                AND rownum = 1
        ) description
FROM    tbl1 a
WHERE   a.descr50 = ' '

Để cập nhật, chỉ cần đưa truy vấn vào dạng xem nội tuyến:

UPDATE  (
        SELECT  (
                SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
                FROM    tbl2 b
                WHERE   b.account = a.account
                        AND rownum = 1
                ) || ' - ' ||
                (
                SELECT  FIRST_VALUE(descr) OVER (ORDER BY descr)
                FROM    tbl3 c
                WHERE   c.product= a.product
                        AND rownum = 1
                ) description
        FROM    tbl1 a
        WHERE   a.descr50 = ' '
        )
SET     descr50 = description


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng DATE trong oracle

  2. Bản cập nhật SQL có ảnh hưởng đến truy vấn con của nó trong quá trình chạy cập nhật không?

  3. Oracle:DDL và khôi phục giao dịch

  4. Cách tạo một thủ tục bên trong một gói trong Oracle

  5. Cách tạo khóa ngoại trong Oracle SQL Developer?