2

私は2つのテーブルを持っています。TableATableB。両方のテーブルには、以下のように 2 つの列を持つデータがあります。

TableA
---------
id  Name
--- ----
1   abc
2   def

TableB
---------
id  Name
--- ----
1   xyz
2   pqr

ここで、アプリケーションから ID のリストを渡し、同じ ID とその名前を次のように取得します。

select id, name 
from TableA 
where id in(1,2) 
union select id, name 
from TableB 
where id in(1,2);

上記のクエリの結果は次のようになります。

1   abc
1   xyz
2   def
2   pqr

しかし、私が必要とするのは、両方のテーブルに同じ ID が存在する場合、TableA の名前ではなく、TableB の名前を考慮する必要があるということです。

Expected output:

1   xyz
2   pqr

もう 1 つは、TableB にデータが含まれていない場合は、TableA のデータをフェッチする必要があるということです。

どうやってやるの?

ありがとう!

4

9 に答える 9

5

LEFT JOIN を使用してみてください。

SELECT TableA.ID, 
  NVL(TableB.Name, TableA.Name) Name FROM 
TableA LEFT JOIN TableB 
 ON TableA.ID=TableB.ID
WHERE TableA.ID IN (1, 2)
于 2013-03-06T11:25:05.697 に答える
1

レコードをクラブ化できる単純なユニオンを使用して、このクエリを試してください

SELECT id, name from tableA where id not in (SELECT id FROM tableB)
UNION ALL
SELECT id, name from tableB
于 2013-03-06T11:21:51.403 に答える
0
SELECT (case when B.id = A.id then  b.id else a.id end) as id,
(case when B.id = A.id then  b.name else a.name end) as name
 FROM tableA a left JOIN tableB b ON (a.id = b.id)
于 2013-03-06T11:39:54.560 に答える
0

MINUS演算子-最初のクエリで返された一意の行のみを返しますが、2番目のクエリでは返しません。

WITH tab_a AS
(
SELECT 1 id, 'abc' val FROM dual
UNION
SELECT 2, 'def' FROM dual
),
tab_b AS
(
SELECT 1, 'xyz' val FROM dual
UNION
SELECT 2, 'pqr' FROM dual
)
-- This is your query --
SELECT * FROM tab_b
MINUS
SELECT * FROM tab_a
/

ID    VAL
----------
1    xyz
2    pqr
于 2013-03-06T14:30:56.173 に答える
0

これを試して:

select id, name from TableA where id in(1,2) and id not in ( select id from TableB) a  union select id, name from TableB where id in(1,2);
于 2013-03-06T11:20:00.790 に答える
0

これを試して

 SELECT id , name from (
     select id, name from TableA where id in(1,2) 
     union select id, name from TableB where id in(1,2)) t
 GROUP BY id;
于 2013-03-06T11:22:24.337 に答える
0

Union All を使用し、exists/not exists を使用して、table_b 内のレコードの存在に基づいて table_a から返される結果を制御します。

 select id,name
 from (
     select id,name
     from   table_b
     union all
     select id,name
     from   table_a
     where  exists (select null from table_b) and
            not exists (
              select null
              from   table_b
              where  table_b.id = table_a.id)
     union all
     select id,name
     from   table_a
     where  not exists (select null from table_b))
 where id in (1,2)

http://sqlfiddle.com/#!4/36f26/3

于 2013-03-06T11:30:44.177 に答える
0

行がA、A + B、またはBにある場合の1つの方法は次のとおりです(tablea常にデータがある場合は、techdoの回答の方が適切です):

select id, name
  from (select id, name, row_number() over (partition by id order by rnk) rn
          from (select id, name, 1 rnk from tableb
                union all
                select id, name, 2 rnk from tablea))
 where rn = 1;
于 2013-03-06T11:33:41.613 に答える