SQL数据库 新表里的数据都从另外两个基本表中获得

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL数据库 新表里的数据都从另外两个基本表中获得相关的知识,希望对你有一定的参考价值。

新表new_table的数据从旧表tab1 ,tab2里取得
tab1和tab2的关联是 tab1是主表 tab2是副表
tab1里的ID 对应tab2的MID 是一对多
请问怎么写SQL语句 我参考了

用INSERT new_table SELECT tab1.*, tab2.* FROM tab1 INNER JOIN tab2 ON tab1.F1=tab1.F3 插入二个基表的数据,这里假定你二个表通过F1,F3关联(关联有一一或一对多,多对一,你要注意JOIN的类型)
出错误 消息 8101,级别 16,状态 1,第 1 行
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'tb车辆导入保险明细表'中的标识列指定显式值。
有1对多的问题 怎么解决呢 是这个问题吗
new_table的字段比 tab1 加 tab2还多了就几个字段

参考技术A 好明显你的new_table表中有一字段是自增型的,自增字段是不能自定义填写值的,只能系统按顺序生成。需要自定义插入自增列字段值,可以先把自增限定去掉或者在插入数据的时候在前面 SET IDENTITY_INSERT ON 。不过通过表复制到表数据的,好像使用SET IDENTITY_INSERT ON 报错,那只能先把字段禁用了追问

取消了自增后
消息 213,级别 16,状态 1,第 1 行
列名或所提供值的数目与表定义不匹配。
是一对多的问题吗

追答

列名或所提供值的数目与表定义不匹配。你看下new_table一共有多少个字段,tab1.*, tab2.* 查询出来有多少个字段,插入的查询值字段需要跟new_table字段是一致(不一致也行,但只能少不能多,而且插入时要表明比如INSERT new_table (字段1,字段2) SELECT 。。。。)

追问

谢谢 把列名都写明确后 确实插入成功了 还有1个问题
tab2 本来有9654行 new_table只有9568行啊
以前是tab对应tab2 可能tab2 有2行是 tab1的1行
tab2是tab1的副表 主表 1对多副表
是不是这样的问题导致了啊

追答

嗯,你试下更改jion类型试试咯

参考技术B 1. 这里面有错误:
INSERT new_table SELECT tab1.*, tab2.* FROM tab1 INNER JOIN tab2 ON tab1.F1=tab1.F3
应该是ON tab1.F1=tab2.F3 吧

2. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'tb车辆导入保险明细表'中的标识列指定显式值。
这个应该是有 IDENTITY列,所以你最好这么写

INSERT new_table(xx,yy,....) SELECT tab1.axx,ayy,..., tab2.bxx,byy,... FROM tab1 INNER JOIN tab2 ON tab1.F1=tab1.F3

然后注意indentity列。追问

你的意思是把列名都写出来?

追答

1. 是的,我建议,最好这么做

2. 我建议你把3个表的自增长列搞清楚
目标表的自增长一般不写,比如:
比如表ta有id(自增长),name
insert into ta(name) values('a')
如果必须写,那么要把自增长的属性暂时停用。

3. new_table的字段比 tab1 加 tab2还多了就几个字段
!!!那更加要写出字段列表啊!!!

追问

谢谢 把列名都写明确后 确实插入成功了 还有1个问题
tab2 本来有9654行 new_table只有9568行啊
以前是tab对应tab2 可能tab2 有2行是 tab1的1行
tab2是tab1的副表 主表 1对多副表
是不是这样的问题导致了啊

追答

你这2个表之间有外键约束吗?
如果没有,估计是tab2中有的内容(F3)在tab1中没有(F1)
如果有,不应该的。

参考技术C 不是这个问题,解决办法是你把new_table这个表中的ID自增给去掉,或者不要往new_table里插入ID的值追问

取消了自增后
消息 213,级别 16,状态 1,第 1 行
列名或所提供值的数目与表定义不匹配。
是新的什么问题吗

追答

这说明你要插入的表的字段和现有的表的字段不一致,字段多了或者少了,比较一下,然后只写你需要插入的字段就行了

参考技术D 你的问题是语句问题和表结构不匹配
所以你的insert语句必须修改为具体列
insert into new_table(字段1,字段2,字段3....字段n)
select tab1.xx, tab2.xx, xxx. tab2.n
from tab1 inner join tab2 on tab1.F1 = tab2.F3追问

谢谢 把列名都写明确后 确实插入成功了 还有1个问题
tab2 本来有9654行 new_table只有9568行啊
以前是tab对应tab2 可能tab2 有2行是 tab1的1行
tab2是tab1的副表 主表 1对多副表
是不是这样的问题导致了啊

追答

对。是因为你inner join引起的, inner join只会拿你2个表都有的纪录

追问

写left join就对了?

追答

Correct !

追问

!不明白

追答

写left join就能防止漏掉数据了。

第5个回答  2012-04-17 这个问题不难啊
第一,INSERT new_table SELECT tab1.*, tab2.* FROM tab1 INNER JOIN tab2 ON tab1.F1=tab1.F3
别用 tab.*和 tab2.*
用字段,那些自增字段不用贴上去,我打个比方吧
a表 id,name,age
b表 id,hobby,address
insert into New_table (a.name,a.age,b.hobby,b.address) from a inner join b on a.id=b.id
values(a.name,a.age,b.hobby,b.address)追问

嗯啊 这样可以 就是行数有点不对
因为tab1是tab2的主表 tab2可能2行对应tab1的1行
这样就把inner join 改成left join就好了?

追答

这个看你需求,你是要查以主表为主还是副表为主了
如果主表为主,那么 left join
副表为主,那么 right join

本回答被提问者采纳

sql如何将两个表里的数据同步?

参考技术A

使用 merge into。

使用 merge into,Merge是在SQL Server  2008被引入,它能将Insert,Update,Delete简单的并为一句。根据与源表联接的结果,对目标表执行插入、更新或删除操作。

例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。通过这个描述,我们 可以看出Merge是关于对于两个表之间的数据进行操作的。 

可以直接 select * from 表,然后一个列一个列记录下),通过以上方法直接复制所有字段名,方便以下运用。

得出相关表的所有列名后,下面就是运用到merge into 里面去了。快速运用表字段进行粘贴到merge 里面的方法是:将所有字段复制粘贴到excel里面,然后用EXCEL & 符号合并增加字符号,如图:

运行以上代码成功后,F_Test 库里面的biitm01t 表就跟正式库里面 的biitm01t 表的数据一样了。

以上是关于SQL数据库 新表里的数据都从另外两个基本表中获得的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql 语句查找一个表里的两个字段重复的记录

SQL中同一个表中,一个字段里面的值等于 另外一个表里面的值 例如表ABC 字段D里面的值如何更新到字段E里面

如何在sql数据库表里加入新的一列(表里原有数据)

请教怎么用SQL对比两个表中身份证号字段不一样的数据

如何在sql数据库表里加入新的一列(表里原有数据)

sql如何将两个表里的数据同步?