2016-10-11 32 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