简体   繁体   English

在SQL中使用LEFT OUTER JOIN中的CASE语句

[英]Using CASE Statements in LEFT OUTER JOIN in SQL

I've got a scenario where I want to switch on two different tables in an outer join. 我有一个场景,我想在外部联接中切换两个不同的表。 It goes something like this:- 它是这样的: -

         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)

...but it doesn't work. ......但它不起作用。 Any suggestions? 有什么建议?

Use (Oracle 9i+): 使用(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

Here's another possibility, although I haven't tried it on Oracle: 这是另一种可能性,虽然我没有在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

This query joins records from the EMP table to either the DEPT table or the SPECIAL_OPS table, depending on the value of EMP.DEPTNO ... 此查询将来自EMP表的记录连接到DEPT表或SPECIAL_OPS表,具体取决于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>

I have included the filter on EMP.DEPTNO in the ON clauses. 我已将过滤器包含在ON子句中的EMP.DEPTNO上。 This might be unnecessary if the data in the tables is exclusive (ie DEPTNO = 30 could only join to DEPT and DEPTNO = 50 could only join to SPECIAL_OPS). 如果表中的数据是独占的(即DEPTNO = 30只能加入DEPT而DEPTNO = 50只能加入SPECIAL_OPS),这可能是不必要的。 However, if the identifier can appear in both tables it is as well to be explicit. 但是,如果标识符可以出现在两个表中,那么它也是明确的。 Besides, making our intent clear is always good practice. 此外,明确我们的意图始终是良好的做法。 Apart from anything else, we cannot be sure about the future state of the data. 除了其他任何事情,我们无法确定未来的数据状态。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM