Oracle sql查询联合操作?

时间:2013-03-06 11:16:36

标签: sql oracle

我有两张桌子。 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的数据。

我该怎么做?

谢谢!

9 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

使用简单联合尝试此查询,您可以记录

SELECT id, name from tableA where id not in (SELECT id FROM tableB)
UNION ALL
SELECT id, name from tableB

答案 2 :(得分: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);

答案 3 :(得分: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;

答案 4 :(得分: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

答案 5 :(得分: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;

答案 6 :(得分: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)

答案 7 :(得分: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

答案 8 :(得分:0)

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

override func loadView() {
    self.tableview.delegate = self
    self.tableview.dataSource = self
}