Sql server 将sql server中不带主键的不同表中带主键的行插入到表中

Sql server 将sql server中不带主键的不同表中带主键的行插入到表中,sql-server,Sql Server,我希望能很好地解释我的问题 我有一个带有主键的新表 如何从不同的表中插入表? 我的问题是一个没有主键的表,我不知道如何从表中选择一行并插入到新表中 范例- 新表1 AssetId是主键 表2 我需要在表1中插入一行 表3 我的剧本- insert AssetBusStops (AssetId,StopCode,StopId,Description,ZoneId) select Assets.Id,stops_ppp.stop_code,stops_ppp.stop_id,stops

我希望能很好地解释我的问题

我有一个带有主键的新表

如何从不同的表中插入表? 我的问题是一个没有主键的表,我不知道如何从表中选择一行并插入到新表中

范例-

新表1

  • AssetId是主键
表2

  • 我需要在表1中插入一行
表3

我的剧本-

insert AssetBusStops (AssetId,StopCode,StopId,Description,ZoneId)
select  Assets.Id,stops_ppp.stop_code,stops_ppp.stop_id,stops_ppp.stop_desc,stops_ppp.zone_id from Assets inner join stops_ppp 
on Assets.AssetCode = stops_ppp.stop_code 
例外情况-

Msg 2627,第14级,状态1,第11行 违反主键约束“PK_AssetBusStops”。无法在对象“dbo.AssetBusStops”中插入重复键。重复的键值为(2763)。 声明已终止


Assets
AssetCode
列的
20001
值与表
stops\u ppp
中的3行相匹配,结果关联查询中的这3行在
id
列中具有相同的值
2763

因此,您的查询尝试插入3行,而不仅仅是1行,这将在主键中创建重复项,这是不允许的。
您应该在查询结果中应用筛选器,例如:

insert AssetBusStops (AssetId,StopCode,StopId,Description,ZoneId)
select top 1 ASsets.Id, 
  stops_ppp.stop_code, stops_ppp.stop_id, stops_ppp.stop_desc, stops_ppp.zone_id 
from Assets inner join stops_ppp 
on Assets.AssetCode = stops_ppp.stop_code 
order by stops_ppp.stop_code
这(对于您的示例数据)仅返回1行(注释中要求的任意ow),并且可以安全插入。

A)如果您没有FK到表AssetBusStops:

  • 将PK列更改为标识(1,1)
  • 从插入脚本中删除PK值
  • B) 如果您有FK到表AssetBusStops:
    尝试使用“不存在”或“合并”

    有关SQL的问题,请参阅。另外,
    dbo.AssetBusStops
    表的主键是什么?这个问题真的与MySQL有关吗?或者它实际上是关于“SQL server”(看起来是这样的)?@Progman谢谢你的帮助。。。我向SQL server提出的问题以及表AssetBusStops中assetId的主键在您的
    AssetBusStops
    表中只能有唯一的
    assetId
    值可以吗?还是您希望有多行具有相同的
    assetId
    值?请将您的问题包括
    选择的输出。。。从…起内部连接。。。在…
    部分,将其添加到您的查询中。还要检查是否有具有相同
    Assets.Id
    值的条目,特别是
    2763
    值的条目。谢谢您的朋友。。。。如果我想从stop_ppp中选择top(1)行并插入表assetbusstops,如何执行?top 1按什么顺序?所有3行都有相同的stop_代码,因此这将选择任意行。这是你想要的吗?不,不需要交叉申请。请参阅我编辑的答案。