2010-03-22 9 views
5

Tengo un escenario en el que quiero activar dos tablas diferentes en una combinación externa. Es algo como esto: -Uso de sentencias CASE en IZQUIERDA UNIÓN EXTERNA en 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) 

... pero no funciona. ¿Alguna sugerencia?

+2

Podría valer la pena volver a examinar su diseño de base de datos. Si tanto table2 como table3 tienen los mismos esquemas o esquemas similares, ¿por qué son tablas diferentes? –

+0

También vale la pena volver a examinar su ejemplo. Parece haber una confusión de alias/nombre de tabla. – jva

+0

Solo tiene que unirse a AMBAS tablas y mover la parte CASE a la lista de columnas – user38123

Respuesta

4

Uso (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

Para filas donde mt.id es 2 pero hay múltiples coincidencias en yt2 para esa identificación, esto podría generar duplicados. –

+0

@Gary: Cierto, lo pensé cuando publiqué, pero decidí publicar una consulta que coincidiera con el OP literal. –

+0

Gracias. esto funcionó bien y no, no se supone que haya ningún valor duplicado, así que esto manejó eso también. –

1

Esta consulta se une con los registros de la tabla EMP a cualquiera de la tabla DEPT o la mesa SPECIAL_OPS, dependiendo del valor de 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> 

He incluido el filtro en EMP.DEPTNO en las cláusulas ON. Esto podría ser innecesario si los datos en las tablas son exclusivos (es decir, DEPTNO = 30 solo podría unirse a DEPT y DEPTNO = 50 solo podría unirse a SPECIAL_OPS). Sin embargo, si el identificador puede aparecer en ambas tablas, también debe ser explícito. Además, hacer que nuestra intención sea clara es siempre una buena práctica. Aparte de cualquier otra cosa, no podemos estar seguros sobre el estado futuro de los datos.

3

Aquí es otra posibilidad, aunque no he probado en 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 
Cuestiones relacionadas