2017-03-15 87 views
0

嗨,我有兩個表A和BA有6行,而b有7行。兩個表在名稱列中都有公共值。表中的所有6行都存在於b表中名稱列。從表格子句中的兩個表中選擇結果

當我寫查詢select * from a,b其中a.name = b.name我得到14行返回我期待與結果中的6行的內部聯接。

請解釋一下當我們在form子句中有兩個表時,查詢是如何工作的。

表A enter image description here

表B enter image description here

查詢是 SELECT * FROM A,B其中a.tt = b.tt和a.nename = b.nename;

reuslt是 enter image description here

+0

爲什麼不使用標準連接語法? – thebjorn

+0

我可以但我只是問,當我們使用這樣的查詢會發生什麼,它是一個完整的連接發生或在這裏發生了什麼? –

回答

-1

你應該做一些像全外連接在您需要的結果,距離我建議這樣的事情

select * from a full outer join b on a.tt = b.tt and a.nename=b.nename; 

如果你處理的是一個更大的數據表設置像varchar這樣的數據類型連接可能需要花費很多時間才能加載結果集。因此,這將是更好地使用外鍵或主鍵連接

https://www.w3schools.com/sql/sql_join_full.asp

+1

加入將導致完全相同的記錄數 –

+0

我的問題是在查詢中發生了什麼?我可以使用連接,但我想擱淺如何執行查詢時,我使用這樣的查詢 –

+0

這樣的查詢select * from a,b其中a.tt = b.tt和a.nename = b.nename將採取一個記錄從一個和將嘗試匹配它的所有記錄,並返回匹配和發生與a和b的所有行,因爲你有重複的數據,它會返回錯誤的結果集 – YouKnowWhoIAm

1

你兩個表(除了{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 
+0

我可以利用內部連接並獲得結果,但我的問題是目前在這個查詢中發生了什麼,爲什麼14行將來 –

+0

@ Sunil Kumar,我想@Conrad Frix解釋得非常好。當你進行連接時,對於'a'表中的每一行,它都會嘗試在表'b'中找到匹配的行,如果你仔細分析你的表,你會發現。試試這個練習:從表'a'(基於'nename'和'tt')嘗試找到表'b'中與表'a'中第一行相匹配的行,並打印這些行(在一張紙上),併爲表格'a'中的每一行重複此操作。你會得到相同的結果。 – ahoxha