tbl_a
cap_id| yr_a| sp_a| iso_a| area_a| qty_a | prod_a |
3| 2015| TRR| 54| 8| 120 | 0 |
678| 2015| BOM| 62| 27| 0.0 | 0 |
20| 2015| TRR| 54| 27| 0.0 | 0 |
45| 2015| FRC| 7| 15| 86800 | 0 |
52| 2015| AZB| 12| 6| 987 | 0 |
tbl_b
aqua_id| yr_b| sp_b| iso_b| area_b| qty_b | prod_b |
78| 2015| OTS| 32| 27| 6868 | 1 |
333| 2015| FRC| 7| 15| 550 | 1 |
334| 2015| FRC| 7| 15| 550 | 2 |
789| 2015| TRR| 54| 27| 45000 | 3 |
987| 2015| TRR| 32| 27| 40 | 2 |
我得到了完整的外部加入,我一直在寻找
但是查询还生成了一大堆所有null记录(tbl_c中的7-9)
tbl_c-最终TBL
id| cap_id| aqua_id| yr_a| yr_b| sp_a| sp_b| iso_a| iso_b|area_a|area_b| qty_a| qty_b | prod_a | prod_b
1 | 20| 789| 2015| 2015| TRR| TRR| 54| 54| 27| 27| 0.0| 45000 | 0 | 1
2 | 45| 333| 2015| 2015| FRC| FRC| 7| 7| 15| 15| 86800| 550 | 0 | 1
3 | 45| 334| 2015| 2015| FRC| FRC| 7| 7| 15| 15| 86800| 550 | 0 | 2
4 | 678| NULL| 2015| NULL| BOM| NULL| 62| NULL| 27| NULL| 0.0| NULL | 0 | NULL
5 | 3| NULL| 2015| NULL| TRR| NULL| 54| NULL| 8| NULL| 120| NULL | 0 | NULL
6 | NULL| 78| NULL| 2015| NULL| OTS| NULL| 32| NULL| 27| NULL| 6868 | 0 | 1
7 | NULL| 987| NULL| 2015| NULL| TRR| NULL| 32| NULL| 27| NULL| 40 | 0 | 2
8 | NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL | NULL | NULL
9 | NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL| NULL | NULL | NULL
我正在尝试找出导致额外多个无效记录的是什么?
使用的查询是:
(SELECT a.cap_id, b.aqua_id, a.yr_a, b.yr_b,...., a.qty_a, b.qty_b
FROM Tbl A AS a LEFT JOIN Tbl_B AS b
ON a.yr_a = b.yr_b
AND a.iso_a = b.iso_b
AND a.area_a = b.area_b
AND a.sp_a = b.sp_b
WHERE a.yr_a = 2015)
UNION
(SELECT a.cap_id, b.aqua_id, a.yr_a, b.yr_b,...., a.qty_a, b.qty_a
FROM Tbl_B AS b LEFT JOIN Tble_A AS a
ON a.yr_a = b.yr_b
AND a.iso_a = b.iso_b
AND a.area_a = b.area_b
AND a.sp_a = b.sp_b
WHERE b.yr_b = 2015);
演示:http://rextester.com/awdya21027使用您的示例数据&查询我没有得到重复的空列。这意味着数据问题。
为什么要让它左加入?只需向左切换到b.yr_a。
并消除nulls,通过消除具有所有4个值null的记录来确保至少一个联接标准匹配?
鉴于您的示例数据,完整的外部加入将返回:cap_id和aqua_id订购时
+--------+---------+------+------+-------+-------+
| CAP_ID | AQUA_ID | YR_A | YR_B | QTY_A | QTY_B |
+--------+---------+------+------+-------+-------+
| | 78 | | 2015 | | 6868 |
| | 987 | | 2015 | | 40 |
| 3 | | 2015 | | 120 | |
| 20 | 789 | 2015 | 2015 | 0 | 45000 |
| 45 | 333 | 2015 | 2015 | 86800 | 550 |
| 678 | | 2015 | | 0 | |
+--------+---------+------+------+-------+-------+
以下查询返回:
+----+--------+---------+------+------+----------+----------+
| | cap_id | aqua_id | yr_a | yr_b | qty_a | qty_b |
+----+--------+---------+------+------+----------+----------+
| 1 | NULL | 78 | NULL | 2015 | NULL | 6868,00 |
| 2 | NULL | 987 | NULL | 2015 | NULL | 40,00 |
| 3 | 3 | NULL | 2015 | NULL | 120,00 | NULL |
| 4 | 20 | 789 | 2015 | 2015 | 0,00 | 45000,00 |
| 5 | 45 | 333 | 2015 | 2015 | 86800,00 | 550,00 |
| 6 | 678 | NULL | 2015 | NULL | 0,00 | NULL |
+----+--------+---------+------+------+----------+----------+
这似乎是完整外部连接的正确结果。如果我在A或B中具有重复的值,则此查询会返回这些重复项,因为联盟中的独特之处并没有像我们进行联盟一样发生。不是工会。
(SELECT a.cap_id, b.aqua_id, a.yr_a, b.yr_b, a.qty_a, b.qty_b
FROM tbl_A AS a
LEFT JOIN tbl_B AS b
ON a.yr_a = b.yr_b
AND a.iso_a = b.iso_b
AND a.area_a = b.area_b
AND a.sp_a = b.sp_b
WHERE a.yr_a = 2015
and (a.yr_a is not null
or a.iso_a is not null
or a.area_a is not null
or a.sp_a is not null))
UNION ALL
(SELECT a.cap_id, b.aqua_id, a.yr_a, b.yr_b, a.qty_a, b.qty_b
FROM tbl_A AS a
RIGHT JOIN tbl_B AS b
ON a.yr_a = b.yr_b
AND a.iso_a = b.iso_b
AND a.area_a = b.area_b
AND a.sp_a = b.sp_b
WHERE b.yr_b = 2015
and (b.yr_b is not null
or b.iso_b is not null
or b.area_b is not null
or b.sp_b is not null)
and a.iso_a is null #to exclude extra nulls duplicated by union all.
);
答案似乎很简单。如果您选择第一选择并运行:
SELECT a.*, b.*
FROM Tbl_A AS a LEFT JOIN Tbl_B AS b
ON a.yr_a = b.yr_b
AND a.iso_a = b.iso_b
AND a.area_a = b.area_b
AND a.sp_a = b.sp_b
WHERE a.yr_a = 2015
您可能应该获得5条结果行,因为5行是TBL_A的。问题在于,由于联接标准,并非所有这些线都与TBL_B中的线相连。因此,当您加入这些表时,对于TBL_A的一些行,将有tbl_b的列,因为连接为外部。
也适用于您的第二个查询:
SELECT a.*, b.*
FROM Tbl_B AS b LEFT JOIN Tbl_A AS a
ON a.yr_a = b.yr_b
AND a.iso_a = b.iso_b
AND a.area_a = b.area_b
AND a.sp_a = b.sp_b
WHERE b.yr_b = 2015
tbl_b的行没有与tbl_a的确切连接,因此,由于您将加入到b,因此您将拥有具有大量nulls的tbl_b行。
我建议您将它们运行1,然后查看每个查询的结果。
nulls是因为:在第二个子句变量之一的第二子句中,在第二个左边的一个子句中没有" ne is null"。由于我被留下的事实而加剧了我将一个较短的表加入一个更长的表(对于tbl_b< tbl_a),因此对于所有TBL_A 2015记录,TBL_B中不存在任何记录。