1

条件に基づいて2つの異なるテーブルを左結合する方法を教えてください。助けていただければ幸いです。

SELECT A.id,
       A.flag,
       B.fname,
       B.lname
FROM   Table1 A
       CASE 
            WHEN ISNULL(A.flag, 0) = 0 THEN LEFT
       JOIN Table2 B
            ON  B.id = A.id
                ELSE
       LEFT JOIN Table3 B
            ON  B.id = A.id
4

4 に答える 4

2

できません。selectただし、両方のテーブルを結合してから、句で必要な値を選択できます。

SELECT A.id, A.flag,
       (case when coalesce(A.flag, 0) = 0 then b.fname else c.fname end) as fname,
       (case when coalesce(A.flag, 0) = 0 then B.lname else c.lname end) as lname
FROM Table1 A left outer join
     Table2 B
     on B.id = A.id left outer join
     Table3 C
     on c.id = A.id

これにより、任意のIDに対してTable2またはTable3に複数の行がある場合、余分な行が生成されます。

通常は効率が悪い代替手段と同じように、次のこともできます。

select a.id, a.flag,
       MAX(case when coalesce(A.flag, 0) = 0 and which = 'b' or
                     coalesce(A.flag, 0) <> 0 and which = 'c'
                then b.fname
           end) as fname,
       MAX(case when coalesce(A.flag, 0) = 0 and which = 'b' or
                     coalesce(A.flag, 0) <> 0 and which = 'c'
                then b.lname
           end) as lname
from table1 A left outer join
     ((select b.*, 'b' as which from table2 b)
      union all
      (select c.*, 'c' as which from table3 c)
     ) b
group by a.id, a.flag

group by不要な重複を排除します。

于 2013-02-08T19:39:34.747 に答える
0
SELECT A.id,
       A.flag,
       CASE 
            WHEN ISNULL(A.flag, 0) = 0 THEN B1.fname
            ELSE B2.fname
       END as fname,
       CASE 
            WHEN ISNULL(A.flag, 0) = 0 THEN B1.lname
            ELSE B2.lname
       END as lname
FROM   Table1 A
       LEFT JOIN Table2 B1
            ON  B1.id = A.id
       LEFT JOIN Table3 B2
            ON  B2.id = A.id

これを試して:

 CASE 
        WHEN ISNULL(A.flag, 0) = 0 THEN B1.fname + ' ' + B1.lname
            ELSE B2.fname + ' ' + B2.lname
        END as name
于 2013-02-08T19:43:51.590 に答える
0

直接行うことはできません。ただし、実際に機能する完全に直感的でない方法があります。さまざまな条件を使用して左結合を実行し、合体します。このようなもの。

select a.id
, coalesce(c.name, b.name, 'no name found') name

from tableA a left join tableB b on a.field1 = b.field1
left join tableC c on a.field1 = c.field2

etc
于 2013-02-08T19:45:03.497 に答える
0

結合するテーブルはA.flagに依存しているため、join句でその知識を適用する必要があります...

SELECT A.id, A.flag, 
    fname = coalesce(t2.fname, t3.fname), 
    lname = coalesce(t2.lname, t3.lname)
FROM Table1 A
LEFT JOIN Table2 t2 on t2.id = A.id and isnull(A.flag, 0) = 0
LEFT JOIN Table3 t3 on t3.id = A.id and isnull(A.flag, 0) = 1
于 2013-02-08T19:50:21.443 に答える