難度大。先查出左反連接和右反連接,再對兩張寬表進行縱向連接。select * from A left join B on A.key=B.key where B.key is null是左反連接,select * from A right join B on A.key=B.key where A.key is null是右反連接。
正確答案是:C
專業(yè)分析:
題目要求查詢的結(jié)果是圖中涂色部分,即需要找出左表A和右表B中不匹配的記錄。具體來說,這包括以下兩部分:
1. 左表A中有而右表B中沒有的記錄。
2. 右表B中有而左表A中沒有的記錄。
選項C的SQL語句如下:
```sql
select * from A left join B on A.key = B.key where B.key is null
union
select * from A right join B on A.key = B.key where A.key is null;
```
分析這段SQL語句:
1. `select * from A left join B on A.key = B.key where B.key is null`:
- 這部分查詢找出了左表A中有但右表B中沒有匹配記錄的所有記錄。通過`left join`,即使B表中沒有匹配的記錄,A表中的記錄也會出現(xiàn)在結(jié)果集中。`where B.key is null`條件確保了只選取那些在B表中沒有匹配記錄的A表記錄。
2. `select * from A right join B on A.key = B.key where A.key is null`:
- 這部分查詢找出了右表B中有但左表A中沒有匹配記錄的所有記錄。通過`right join`,即使A表中沒有匹配的記錄,B表中的記錄也會出現(xiàn)在結(jié)果集中。`where A.key is null`條件確保了只選取那些在A表中沒有匹配記錄的B表記錄。
通過`union`操作將這兩部分結(jié)果合并起來,就得到了所有不匹配的記錄。
其他選項分析:
- A: `select * from A full join B using(key);`:
- `full join`會返回A和B中所有匹配和不匹配的記錄,而不僅僅是不匹配的記錄,因此不符合要求。
- B: `select * from A left join B using(key) union select * from B right join B using(key);`
- 這里的`right join B using(key)`是錯誤的,應該是`right join A using(key)`。即使修正了,`union`操作也會去重,結(jié)果可能包含重復的記錄。
- D: `select * from A left join B using(key) union all select * from B right join B using(key);`
- 同樣地,`right join B using(key)`是錯誤的,應該是`right join A using(key)`。即使修正了,`union all`會包含重復的記錄,不符合題意。
綜上所述,選項C是唯一正確的答案。