4

我有两个具有完全相同列的表

表 A

标识标志
1年
2年
3 牛
4 牛

表 B

标识标志
1年
2
3 牛
4

我想在 Oracle 中编写一个选择查询,它将显示表 A 中的所有行,其中FLAG列与表 B 不同但具有匹配的 ID 列

结果应如下所示。

标识标志
2年
4 牛
4

7 回答 7

3

“表 A 中的所有行......作为表 B 具有匹配 ID 的列”:

FROM a JOIN b USING (id)

“其中 FLAG 列不一样”:

WHERE a.flag != b.flag 
   OR (a.flag IS NULL AND b.flag IS NOT NULL)
   OR (b.flag IS NULL AND a.flag IS NOT NULL)

所以,查询将是

SELECT id, a.flag
  FROM a JOIN b USING (id)
WHERE a.flag != b.flag 
   OR (a.flag IS NULL AND b.flag IS NOT NULL)
   OR (b.flag IS NULL AND a.flag IS NOT NULL)

-WHERE条件很丑陋,但有必要捕获表 b 具有NULL- 值但没有 - 值的情况,或者相反......

于 2012-12-17T15:34:34.187 回答
2

这个在oralce中工作..因为列中有null。它不能直接比较,所以需要使用NVL()或等效函数

select a1.* from table_a a1,table_b b 
where A1.id=B.id
and nvl(a1.flag,'y')<>nvl(b.flag,'y')

请参考这个 sqlfiddle:http ://sqlfiddle.com/#!4/241de/1

于 2012-12-17T18:50:18.377 回答
1

这会做,

    select Table_A.id,Table_A.FLAG from 
Table_A join Table_b on Table_A.id=Table_b.id 
where Table_A.FLAG!=Table_b.FLAG 
or (Table_b.FLAG is null and table_a.flag is not null);

sqlfiddle

于 2012-12-17T15:35:29.443 回答
0

怎么样

    SELECT * 
    FROM TABLEA 
      INNER JOIN TABLEB
      ON TABLEA.ID = TABLEB.ID
    WHERE TABLEA.Flag != TABLEB.FLAG
       OR TABLEB.FLAG IS NULL

演示

于 2012-12-17T15:28:25.110 回答
0
  1. 如果一行在表 A 中而不在表 B 中怎么办?你还想展示它吗?这将帮助您决定是要进行内部联接还是外部联接。

假设是这种情况,您可以使用..获取详细信息

select a.id, a.flag, b.flag
  from table_a a,
       table_b b
  where a.id = b.id(+)

由于您需要标志不相等的行..

select a.id, a.flag, b.flag
  from table_a a,
       table_b b
  where a.id = b.id(+)
    and a.flag <> b.flag

还要检查标志是否可以为空,在这种情况下,查询可能需要稍作更改。

于 2012-12-17T15:30:10.990 回答
0
SELECT  a.*
FROM    tableA a
        LEFT JOIN tableB b
            ON a.id = b.ID AND
                a.FLAG = b.FLAG
WHERE   b.ID IS NULL
于 2012-12-17T15:31:36.497 回答
0

在我看来,你是在开玩笑 :) 在这种情况下,Oracle 有特殊的 MINUS 运算符。 证明链接

所以答案非常简短

select id, flag from a
minus
select id, flag from b

SQLFiddle

PS对不起-或者表B中必须有具有相应ID的记录?然后看下面

select id, flag from a where id in (select id from b)
minus
select id, flag from b

SQLFiddle

于 2012-12-18T13:25:39.070 回答