只有列 BOOLVALUE(int) 的 Table_1 的記錄為
- 1
- 1
- 0
- 0
- 0
另一個 Table_2 只有列 BOOLVALUE(int) 的記錄為
- 1
- 1
- 1
- 0
- 0
..我正在嘗試運行查詢
select t1.BOOLVALUE from Table_1 t1
left join Table_2 t2 on t1.BOOLVALUE=t2.BOOLVALUE
令我驚訝的是輸出不是我所期望的。有 12 行有 6 個 1 和 6 個 0。但這不會使連接的作業方式無效嗎?
uj5u.com熱心網友回復:
完全期望 12 行,因為 2 行與 3 行相關,結果為 6 行,3 行與 2 行相關,結果為 6 行;把這些加在一起,你得到 12。
當您根據子句編輯JOIN 所有相關行時。你的條款是. 這意味著所有s in都與所有s in 相關;所以這是與 3 行 (2 * 3) 相關的 2 行。那么所有的s in都與所有的s in 相關;所以這是與 2 行 (3 * 2) 相關的 3 行。因此。JOINONONt1.BOOLVALUE=t2.BOOLVALUE1Table_11Table_20Table_10Table_2(2 * 3) (3 * 2) = 6 6 = 12
如果我們在表中添加一ID列,這可能會變得更清晰一些。
假設您有 2 個這樣的表:
| ID1 | I1 |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 0 |
| 4 | 0 |
| 5 | 0 |
| ID2 | I2 |
|---|---|
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 0 |
| 5 | 0 |
然后假設您有以下查詢:
SELECT T1.ID1,
T2.ID2,
T1.I1,
T2.I2
FROM dbo.Table1 T1
JOIN dbo.Table2 T2 ON T1.I1 = T2.I2
ORDER BY T1.ID1
T2.ID2;
這將產生以下資料集:
| ID1 | ID2 | I1 | I2 |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 1 |
| 1 | 3 | 1 | 1 |
| 2 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
| 2 | 3 | 1 | 1 |
| 3 | 4 | 0 | 0 |
| 3 | 5 | 0 | 0 |
| 4 | 4 | 0 | 0 |
| 4 | 5 | 0 | 0 |
| 5 | 4 | 0 | 0 |
| 5 | 5 | 0 | 0 |
在這里,您可以看到您有一個多對多連接,以及“額外”行的來源。
如果您LEFT JOIN在IDandI列上編輯,從 開始Table1,您將獲得 5 行,其中 1 行具有and的NULL值(在這種情況下,因為雖然匹配,但沒有):ID2I2IDI
SELECT T1.ID1,
T2.ID2,
T1.I1,
T2.I2
FROM dbo.Table1 T1
LEFT JOIN dbo.Table2 T2 ON T1.ID1 = T2.ID1
AND T1.I1 = T2.I2
ORDER BY T1.ID1
T2.ID2;
| ID1 | ID2 | I1 | I2 |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 2 | 1 | 1 |
| 3 | 空值 | 0 | 空值 |
| 4 | 4 | 0 | 0 |
| 5 | 5 | 0 | 0 |
uj5u.com熱心網友回復:
當您加入具有重復值的列時,回傳的行數是兩個表中匹配值數的乘積。
在這種情況下,表 1 中有 2 個 1,表 2 中有 3 個,因此 SQL 回傳 6 種可能的組合 (2 x 3)。由于有 3 x 2 零組合,您總共得到 12 行。
如果您進行了交叉連接,您將獲得 25 行 (5 x 5)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/452417.html
