2010-03-22 42 views
5

Tôi có một kịch bản mà tôi muốn chuyển đổi trên hai bảng khác nhau trong một phép nối ngoài. Nó giống như sau: -Sử dụng các câu lệnh CASE trong LEFT OUTER JOIN trong SQL

  select mytable.id, 
       yourtable.id 
      from mytable 
left outer join (case 
        when mytable.id = 2 then table2 
         yourtable on table1.id = table2.id 
        else 
         table3 yourtable on table1.id = table3.id 
       end) 

... nhưng nó không hoạt động. Bất kỳ đề xuất?

+2

Nó có thể là giá trị tái kiểm tra thiết kế cơ sở dữ liệu của bạn. Nếu cả bảng 2 và bảng 3 có cùng lược đồ hoặc các lược đồ tương tự, thì tại sao chúng lại là các bảng khác nhau? –

+0

Nó cũng đáng xem xét lại ví dụ của bạn. Dường như có sự trộn lẫn bí danh/tablename. – jva

+0

Chỉ cần tham gia vào hai bảng và di chuyển phần CASE vào danh sách cột – user38123

Trả lời

4

Sử dụng (Oracle 9i +):

SELECT mt.id, 
      COALESCE(yt1.id, yt2.id) 
    FROM MYTABLE mt 
LEFT JOIN YOURTABLE yt1 ON yt1.id = mt.id 
         AND yt.id = 2 
LEFT JOIN YOURTABLE yt2 ON yt2.id = mt.id 
+0

Đối với các hàng có mt.id là 2 nhưng có nhiều kết quả phù hợp trong yt2 cho id đó, điều này có thể tạo ra các bản sao. –

+0

@Gary: Đúng vậy, tôi đã nghĩ về nó khi đăng nhưng quyết định đăng truy vấn phù hợp với nguyên văn OP. –

+0

Cảm ơn. điều này làm việc tốt và không có, không có nghĩa vụ phải có bất kỳ giá trị trùng lặp vì vậy điều này xử lý đó là tốt. –

1

Truy vấn này gia nhập các bản ghi từ bảng EMP cho một trong hai bảng DEPT hoặc bảng SPECIAL_OPS, tùy thuộc vào giá trị của EMP.DEPTNO ...

SQL> select e.ename 
    2   , e.job 
    3   , e.deptno 
    4   , coalesce(d.dname, s.dname) as dname 
    5 from emp e 
    6  left outer join dept d 
    7    on (e.deptno = 30 
    8     and e.deptno = d.deptno) 
    9  left outer join special_ops s 
10    on (e.deptno != 30 
11     and e.deptno = s.deptno) 
12 where e.deptno in (30,50) 
13 order by e.deptno, e.empno 
14/

ENAME  JOB   DEPTNO DNAME 
---------- --------- ---------- -------------- 
VAN WIJK SALESMAN   30 SALES 
PADFIELD SALESMAN   30 SALES 
BILLINGTON SALESMAN   30 SALES 
SPENCER MANAGER   30 SALES 
CAVE  SALESMAN   30 SALES 
HALL  CLERK    30 SALES 
VERREYNNE PLUMBER   50 SKUNKWORKS 
FEUERSTEIN PLUMBER   50 SKUNKWORKS 

8 rows selected. 

SQL> 

Tôi đã bao gồm bộ lọc trên EMP.DEPTNO trong mệnh đề ON. Điều này có thể không cần thiết nếu dữ liệu trong các bảng là độc quyền (ví dụ: DEPTNO = 30 chỉ có thể tham gia vào DEPT và DEPTNO = 50 chỉ có thể tham gia vào SPECIAL_OPS). Tuy nhiên, nếu số nhận dạng có thể xuất hiện trong cả hai bảng thì nó cũng rõ ràng. Bên cạnh đó, làm cho ý định của chúng tôi rõ ràng là luôn luôn thực hành tốt. Ngoài bất cứ điều gì khác, chúng tôi không thể chắc chắn về tình trạng dữ liệu trong tương lai.

3

Dưới đây là một khả năng khác, mặc dù tôi đã không thử nó trên Oracle:

select mytable.id, 
     yourtable.id 
from table1 as mytable left outer join 
    (SELECT 2 AS tableid, * 
    FROM table2 
    UNION ALL 
    SELECT 1, * 
    FROM table3) as yourtable 
    ON mytable.id = yourtable.id 
    AND tableid = CASE WHEN mytable.id = 2 THEN 2 ELSE 1 END 
Các vấn đề liên quan