同时加入操作和限制

时间:2016-10-11 07:34:44

标签: mysql sql

我们可以使用连接操作并同时进行限制吗?我希望基于来自数据库另一个数据库(在示例中称为DB2)的两个表来创建数据库上的表(在示例中称为DB1),其中一个列在其他列上有特定条目时填充(在例如“性别”栏中的“4”。 - >如果是,那怎么办?

两个数据库都在同一台服务器上,而DBMS是相同的。 ID1和ID2基于DB2中的table1; ID1和Name基于DB2中的table2。

这是我已经尝试过但我不确定它是否有效和/或它是最好的方法从观点来看我使用的是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; 

或者它是正确的(更好)与AND?:

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; 

2 个答案:

答案 0 :(得分:0)

它们是等价的(只需要小心表别名..anyway)

您可以直接在join子句

中使用和条件
    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

或使用join子句后的位置

    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

答案 1 :(得分:0)

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

是外部联接。因此,如果table2中的table1记录没有匹配,则伪记录将与所有设置为NULL的列连接。

然后你有

WHERE t2.gender = 4

如上所述,所有外部连接的行(即table2中没有匹配的table1记录)都将所有t2字段设置为NULL,因此gender为NULL并且您忽略了外部连接的行,因此小心创建。你也可以在第一时间使用内连接。

对于外连接,条件属于ON子句。 (而且你可能想把它放在那里,所以后来从内连接切换到外连接更简单。)

这个

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

是一个外部联接,当你在表2中找不到与性别4匹配时,你保持table1记录并加入一个空的虚拟table2记录。这很可能是你真正想要的。