英文:
I want to find the difference between 2 tables and the output should be in the expected format
问题
以下是翻译好的部分:
我想要找到两个表之间的差异,输出应该是预期格式。
表AAA(NUM,TXT)
1 One
2 Too
3 Three
4 Four
表BBB(NUM,TXT)
1 One
3
4 Four
2 Two
5 Five
我在Oracle中使用以下查询来获取差异:
select 'only A' where_, only_a.* from (select num, txt from AAA minus select num, txt from BBB) only_a union all
select 'only B' where_, only_b.* from (select num, txt from BBB minus select num, txt from AAA) only_b
输出是
我想要的或预期的输出是
我想要最佳的查询以获得与此问题中所示的期望格式相匹配的输出。
英文:
I want to find the difference between 2 tables and the output should be in the expected format
Table AAA(NUM,TXT)
1 One
2 too
3 Three
4 Four
Table BBB(NUM,TXT)
1 One
3
4 Four
2 Two
5 Five
I am using the below query in oracle to get the differences
select 'only A' where_, only_a.* from (select num, txt from AAA minus select num, txt from BBB) only_a union all
select 'only B' where_, only_b.* from (select num, txt from BBB minus select num, txt from AAA) only_b
OUTPUT is
What I want or Expected Output is
I want best query to get the output in desired format as shown in this question about
答案1
得分: 2
你可以使用单个 FULL OUTER JOIN
来完成这个任务(而不是你的查询,该查询从表中选择 4 次并使用 2 个 MINUS
和一个 UNION ALL
):
SELECT CASE
WHEN a.num IS NOT NULL
THEN 'only A'
ELSE 'only B'
END AS what,
COALESCE(a.num, b.num) AS num,
CASE
WHEN a.num IS NOT NULL
THEN a.txt
ELSE b.txt
END AS txt
FROM aaa a
FULL OUTER JOIN bbb b
ON a.num = b.num AND a.txt = b.txt
WHERE a.num IS NULL
OR b.num IS NULL
ORDER BY num, what
对于样本数据:
CREATE TABLE AAA(NUM,TXT) AS
SELECT 1, 'One' FROM DUAL UNION ALL
SELECT 2, 'too' FROM DUAL UNION ALL
SELECT 3, 'Three' FROM DUAL UNION ALL
SELECT 4, 'Four' FROM DUAL;
CREATE TABLE BBB(NUM,TXT) AS
SELECT 1, 'One' FROM DUAL UNION ALL
SELECT 3, NULL FROM DUAL UNION ALL
SELECT 4, 'Four' FROM DUAL UNION ALL
SELECT 2, 'Two' FROM DUAL UNION ALL
SELECT 5, 'Five' FROM DUAL;
输出:
WHAT | NUM | TXT |
---|---|---|
only A | 2 | too |
only B | 2 | Two |
only A | 3 | Three |
only B | 3 | null |
only B | 5 | Five |
英文:
You can do it with a single FULL OUTER JOIN
(rather than your query which SELECT
s from the tables 4 times and uses 2 MINUS
es and a UNION ALL
):
SELECT CASE
WHEN a.num IS NOT NULL
THEN 'only A'
ELSE 'only B'
END AS what,
COALESCE(a.num, b.num) AS num,
CASE
WHEN a.num IS NOT NULL
THEN a.txt
ELSE b.txt
END AS txt
FROM aaa a
FULL OUTER JOIN bbb b
ON a.num = b.num AND a.txt = b.txt
WHERE a.num IS NULL
OR b.num IS NULL
ORDER BY num, what
Which, for the sample data:
CREATE TABLE AAA(NUM,TXT) AS
SELECT 1, 'One' FROM DUAL UNION ALL
SELECT 2, 'too' FROM DUAL UNION ALL
SELECT 3, 'Three' FROM DUAL UNION ALL
SELECT 4, 'Four' FROM DUAL;
CREATE TABLE BBB(NUM,TXT) AS
SELECT 1, 'One' FROM DUAL UNION ALL
SELECT 3, NULL FROM DUAL UNION ALL
SELECT 4, 'Four' FROM DUAL UNION ALL
SELECT 2, 'Two' FROM DUAL UNION ALL
SELECT 5, 'Five' FROM DUAL;
Outputs:
WHAT | NUM | TXT |
---|---|---|
only A | 2 | too |
only B | 2 | Two |
only A | 3 | Three |
only B | 3 | null |
only B | 5 | Five |
答案2
得分: 1
Sample data:
SQL> with
2 aaa (num, txt) as
3 (select 1, 'One' from dual union all
4 select 2, 'too' from dual union all
5 select 3, 'Three' from dual union all
6 select 4, 'Four' from dual
7 ),
8 bbb (num, txt) as
9 (select 1, 'One' from dual union all
10 select 2, 'Two' from dual union all
11 select 3, null from dual union all
12 select 4, 'Four' from dual union all
13 select 5, 'Five' from dual
14 )
Query:
15 select 'only A' what, a.* from aaa a minus select 'only A', b.* from bbb b
16 union all
17 select 'only B' what, b.* from bbb b minus select 'only B', a.* from aaa a
18 order by 2, 1;
WHAT NUM TXT
only A 2 too
only B 2 Two
only A 3 Three
only B 3
only B 5 Five
SQL>
英文:
Sample data:
SQL> with
2 aaa (num, txt) as
3 (select 1, 'One' from dual union all
4 select 2, 'too' from dual union all
5 select 3, 'Three' from dual union all
6 select 4, 'Four' from dual
7 ),
8 bbb (num, txt) as
9 (select 1, 'One' from dual union all
10 select 2, 'Two' from dual union all
11 select 3, null from dual union all
12 select 4, 'Four' from dual union all
13 select 5, 'Five' from dual
14 )
Query:
15 select 'only A' what, a.* from aaa a minus select 'only A', b.* from bbb b
16 union all
17 select 'only B' what, b.* from bbb b minus select 'only B', a.* from aaa a
18 order by 2, 1;
WHAT NUM TXT
------ ---------- -----
only A 2 too
only B 2 Two
only A 3 Three
only B 3
only B 5 Five
SQL>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论