我们可以使用连接操作并同时进行限制吗?我希望基于来自数据库另一个数据库(在示例中称为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;
答案 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记录。这很可能是你真正想要的。