2016-10-11 33 views
0

我們可以使用連接操作並同時進行限制嗎?我想根據數據庫的另一個數據庫(示例中稱爲DB2)中的兩個表創建一個數據庫(在本例中稱爲DB1)的表,其中一個列在其他列上有特定條目時填充(在例如「性別」欄中的「4」)。 - >如果是,那該怎麼辦?同時加入操作和限制

兩個數據庫位於同一臺服務器上,而DBMS相同。 DB2中基於table1的ID1和ID2; ID1和名稱基於DB2中的table2。

Here's我嘗試過了,不過我不確定是否它的工作原理和/或它的最好辦法是使用I'm從DB1的觀點產地:

INSERT INTO table3 
      (id1, 
      id2, 
      NAME) 
SELECT t1.id1, 
     t1.id2, 
     t2.NAME 
FROM db1.table1 t1 
     LEFT JOIN db1.table2 t2 
       ON t1.ID1=t2.ID1 
WHERE gender = 4; 

或者是正確的(更好)與和?:

INSERT INTO table3 
      (id1, 
      id2, 
      NAME) 
SELECT t1.id1, 
     t1.id2, 
     t2.NAME 
FROM db1.table1 t1 
     LEFT JOIN db1.table2 t2 
       ON t1.ID1=t2.ID1 
       AND gender = 4; 
+1

性別是t1還是t2列?當離開時加入了巨大的差異... – jarlh

+0

性別是表2中的一列 – AbsoluteBeginner

+0

不應該ON謂詞讀取ID1 = ID2? – Serg

回答

0

他們是等價的(只是用表的別名..anyway小心)

您可以使用和條件直接在連接語句

INSERT INTO table3 
     (id1, 
     id2, 
     NAME) 
     SELECT t1.id1, 
      t1.id2, 
      t2.NAME 
     FROM db1.table1 t1 
      LEFT JOIN db1.table2 t2 
        ON t1.ID1=t2.ID1 and t1.gender = 4 

,或者使用其中連接子句後

INSERT INTO table3 
     (id1, 
     id2, 
     NAME) 
     SELECT t1.id1, 
      t1.id2, 
      t2.NAME 
     FROM db1.table1 t1 
      LEFT JOIN db1.table2 t2 
        ON t1.ID1=t2.ID1 
     WHERE t1.gender = 4; 

http://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html

+0

ok - 但什麼更好(更快)?這個評論是怎麼回事? 「在ON子句中使用t2.gender條件時,將返回沒有t2命中的t1行,在WHERE子句中使用t2.gender時,左連接變爲內連接,並且僅返回t2命中的t1行 - 其中t2 .gender = 4「 – AbsoluteBeginner

+0

性能是相同的..因爲查詢優化使兩個查詢等價..對於第二部分..是明確的(對我來說)使用列中的where或in和(on子句)必須明確定義..所以你控制代碼操作,但總體上避免了錯誤的代碼。 – scaisEdge

+0

工作正常 - 謝謝! – AbsoluteBeginner

0

LEFT JOIN db1.table2 t2 ON t1.ID1 = t2.ID1 

是外連接。因此,如果table1中沒有匹配的table1記錄,則虛擬記錄會與所有設置爲NULL的列進行連接。

那麼你就

WHERE t2.gender = 4 

如前所述,所有外連排(即在表2不敵即table1的記錄)都T2字段設置爲NULL,所以性別是NULL和您關閉外加入瞭如此精心創建的行。那麼你可以首先使用內連接。

對於外連接,條件屬於ON子句。 (你可能要使它成爲一個習慣,反正那裏把它從內部使開關連接到外部連接後更簡單。)

LEFT JOIN db1.table2 t2 ON t1.ID1 = t2.ID1 AND t2.gender = 4; 

是外連接,你保持表1如果您在表2中找不到與性別4匹配的記錄並加入空虛擬表2記錄。這很可能是你真正想要的。

+0

感謝您的幫助:現在我明白了......我還有另一個類似的退出問題:請同時看看:http://stackoverflow.com/questions/39977164/joins -and-限制換不同柱-在最同一時間?noredirect = 1#comment67233553_39977164 – AbsoluteBeginner