【问题标题】:SQL: UPDATE many-to-many's intermediate tableSQL:更新多对多的中间表
【发布时间】:2016-03-23 09:43:53
【问题描述】:

我有桌子 A 和桌子 B。它们之间的关系使用中间表 AB 完成,该表存储两者的 ID。

Table A 

ID integer
Value varchar(MAX)

Table B 

ID integer
Value varchar(MAX)

Table AB 

AID integer
BID integer

我可以用JOIN's 选择需要的数据,但是如何将数据写入AB? 我的意思是如果我会得到AIDinteger 的列表(作为自定义类型Array_Integer table(ID integer)),即BID,如何更新AB 中的关系收到BID 的列表? 我可以做很多肮脏和手动的工作,但我正在寻找更真实的方法。

UPD:检查 pastebin 上的架构 — http://pastebin.com/BeKm2h3F

【问题讨论】:

  • 您可以使用MERGE语句来管理(基于列表插入/更新/删除)子表或映射表
  • 如果你能解释一下就好了。
  • 您以什么格式获取此列表?
  • 作为自定义类型,table(ID integer)
  • 创建一些样本数据来测试和预期输出

标签: sql sql-server tsql sql-update many-to-many


【解决方案1】:

如果我理解你的正确,这个查询应该是你需要的。

INSERT INTO AB
SELECT * FROM 
(
    -- Here you write your AID value instead of 1
    SELECT 1 AS AID
) AS a1
CROSS JOIN 
(
    -- Query that returns list if id's from table B
    SELECT ID AS BID FROM B WHERE ID < 5
)

【讨论】:

    【解决方案2】:

    您可以按如下方式更新 TableAB:

    declare @Aid int
    declare @Bid int
    
    insert into TableA(value)
    select 'abcd'
    set @Aid = ident_currect('TableA')
    
    insert into TableB(value)
    select 'xyz'
    set @Bid = ident_currect('TableB')
    
    insert into TableAB  -- This will update your junction table
    select @Aid,@Bid
    

    我假设您的 tableA 和 TableB 有标识列。你也可以使用 scope_identity() 代替 ident_currect()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多