2015-10-26 116 views
-1

我有前两个表比较:SQL插入值从其他2个表

表1

id code 
1 a 
2 b 
3 

表2

id code 
4 a 
5 b 
6 

表3

id id1 
1 4 
2 5 

我基本上想要插入表3,其中表1和表2的ID基于table1.name = table2.name

INSERT INTO table3(id,id1) 
      SELECT t1.id,t2.id FROM table1 t1, table2 t2 where t1.name=t2.name; 

但是表1和表2对第三排空代码,我将如何比较作为null = null不会工作。

帮助表示赞赏..

+0

它是'n​​ame'还是'code'? –

+1

我想你并没有使用你的标签中列出的每一个DBMS ...... –

回答

0

使用内部联接

INSERT INTO table3(id,id1) SELECT t1.id, t2.id 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.name = t2.name OR (t1.name IS NULL AND t2.name IS NULL); 
1

只需添加一个(t1.name IS NULL AND t2.name IS NULL)测试:

INSERT INTO table3 (id, id1) 
SELECT t1.id, t2.id 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.name = t2.name OR (t1.name IS NULL AND t2.name IS NULL); 
+0

这种语法适用于所有带标签的DBMS :) – dnoeth

1

正如我前几天了解到,MySQL支持语法增强<=>比较NULL等于:

INSERT INTO table3(id,id1) 
     SELECT t1.id,t2.id 
     FROM table1 t1 JOIN table2 t2 
     ON t1.name <=> t2.name; 

编辑:

MySQL reference

+0

哇,不知道,有趣:) [这里是参考](https: //dev.mysql.com/doc/refman/5.0/en/comparison-operators.html) –

+0

@XLAnt:感谢您提供参考,并添加了它... – dnoeth

0

在Oracle中,使用NVL(),用于转换空值到较少使用的字符。

INSERT INTO table3(id,id1) 
SELECT t1.id,t2.id 
FROM table1 t1, table2 t2 
WHERE nvl(t1.code,'$$')=nvl(t2.code,'$$'); 
+0

或者更好地使用'COALESCE'而不是'NVL'这是不是专有的,并支持所有DBMS(包括Oracle) – dnoeth

+0

@dnoeth我不知道'COALESCE'。谢谢你的建议。 –