嗨,我有兩個表A和BA有6行,而b有7行。兩個表在名稱列中都有公共值。表中的所有6行都存在於b表中名稱列。從表格子句中的兩個表中選擇結果
當我寫查詢select * from a,b其中a.name = b.name我得到14行返回我期待與結果中的6行的內部聯接。
請解釋一下當我們在form子句中有兩個表時,查詢是如何工作的。
查詢是 SELECT * FROM A,B其中a.tt = b.tt和a.nename = b.nename;
嗨,我有兩個表A和BA有6行,而b有7行。兩個表在名稱列中都有公共值。表中的所有6行都存在於b表中名稱列。從表格子句中的兩個表中選擇結果
當我寫查詢select * from a,b其中a.name = b.name我得到14行返回我期待與結果中的6行的內部聯接。
請解釋一下當我們在form子句中有兩個表時,查詢是如何工作的。
查詢是 SELECT * FROM A,B其中a.tt = b.tt和a.nename = b.nename;
你應該做一些像全外連接在您需要的結果,距離我建議這樣的事情
select * from a full outer join b on a.tt = b.tt and a.nename=b.nename;
如果你處理的是一個更大的數據表設置像varchar這樣的數據類型連接可能需要花費很多時間才能加載結果集。因此,這將是更好地使用外鍵或主鍵連接
加入將導致完全相同的記錄數 –
我的問題是在查詢中發生了什麼?我可以使用連接,但我想擱淺如何執行查詢時,我使用這樣的查詢 –
這樣的查詢select * from a,b其中a.tt = b.tt和a.nename = b.nename將採取一個記錄從一個和將嘗試匹配它的所有記錄,並返回匹配和發生與a和b的所有行,因爲你有重複的數據,它會返回錯誤的結果集 – YouKnowWhoIAm
你兩個表(除了{2, 2017-03-04 03:00:00}
其中有三人份)中得到重複這就是爲什麼你會得到14 =(2 * 4)+(2 * 3)。
很難理解重複的數據。當它在連接的兩邊都重複時更難做到。
你可以做類似
With fixedA (SELECT
*,
row_number() over (partition by nename, tt order by nename) rn
FROM
A),
fixedb (SELECT
*,
row_number() over (partition by nename, tt order by nename) rn
FROM
B)
SELECT *
FROM fixedA a full outer join fixedb b
on a.neName = b.neName
and a.tt = b.tt
and a.rn = b.rn
然而,這會留下一架B記錄使用空的記錄
的ROW_NUMBER也似乎做的CellID做什麼,所以你可能只是做
SELECT *
FROM a full outer join b
on a.neName = b.neName
and a.tt = b.tt
and a.cellID = b.cellID
我可以利用內部連接並獲得結果,但我的問題是目前在這個查詢中發生了什麼,爲什麼14行將來 –
@ Sunil Kumar,我想@Conrad Frix解釋得非常好。當你進行連接時,對於'a'表中的每一行,它都會嘗試在表'b'中找到匹配的行,如果你仔細分析你的表,你會發現。試試這個練習:從表'a'(基於'nename'和'tt')嘗試找到表'b'中與表'a'中第一行相匹配的行,並打印這些行(在一張紙上),併爲表格'a'中的每一行重複此操作。你會得到相同的結果。 – ahoxha
爲什麼不使用標準連接語法? – thebjorn
我可以但我只是問,當我們使用這樣的查詢會發生什麼,它是一個完整的連接發生或在這裏發生了什麼? –