2

我有两张桌子。TableATableB。这两个表都有一些数据,两列如下。

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,那么应该考虑 TableB 的名称,而不是 TableA 的名称。

Expected output:

1   xyz
2   pqr

还有一个是,如果 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 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

如果行可以在 A、A+B 或 B 中,一种方法是(如果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 回答
0

使用 Union All 和存在/不存在来根据 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
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 运算符 - 仅返回第一个查询返回的唯一行,而不返回第二个查询返回的唯一行:

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

以下代码用于从两个表(A + B)中选择数据,然后使用减号取出数据并连接不需要的行。如果需求从表 A 而不是表 B 中选择名称发生变化,则可以轻松修改代码。

select * from tableA where id in (1,2)
union
select * from tableB where id in (1,4)
minus 
select a,id, a.Name from tableA a join tableB b on a.id = b.id where 
a.id in (1,2);
于 2018-01-09T03:40:57.660 回答