我有两个具有完全相同列的表
表 A
标识标志 1年 2年 3 牛 4 牛
表 B
标识标志 1年 2 3 牛 4
我想在 Oracle 中编写一个选择查询,它将显示表 A 中的所有行,其中FLAG
列与表 B 不同但具有匹配的 ID 列
结果应如下所示。
标识标志 2年 4 牛
“表 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
- 值但没有 - 值的情况,或者相反......
这个在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
这会做,
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);
怎么样
SELECT *
FROM TABLEA
INNER JOIN TABLEB
ON TABLEA.ID = TABLEB.ID
WHERE TABLEA.Flag != TABLEB.FLAG
OR TABLEB.FLAG IS NULL
假设是这种情况,您可以使用..获取详细信息
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
还要检查标志是否可以为空,在这种情况下,查询可能需要稍作更改。
SELECT a.*
FROM tableA a
LEFT JOIN tableB b
ON a.id = b.ID AND
a.FLAG = b.FLAG
WHERE b.ID IS NULL