Sql server 2005 多对多关系中的查询示例

Sql server 2005 多对多关系中的查询示例,sql-server-2005,many-to-many,Sql Server 2005,Many To Many,哇,很难找到这个话题的简单解释。简单的多对多关系 三张表,表a、表B和连接表a\U B 我知道如何用键和所有键建立关系,但当执行插入、更新和删除查询时,我有点困惑 基本上,我要找的是一个例子,说明: 如何根据TableB中的ID获取TableA中的所有记录 如何根据TableA中的ID获取TableB中的所有记录 3如何在表A或表B中插入,然后在连接表中进行适当的插入以建立连接 我不是在寻找一个特定项目的解决方案,只是一些可以应用的通用示例。也许你周围有什么东西 SELECT * FROM a

哇,很难找到这个话题的简单解释。简单的多对多关系

三张表,表a、表B和连接表a\U B

我知道如何用键和所有键建立关系,但当执行插入、更新和删除查询时,我有点困惑

基本上,我要找的是一个例子,说明:

如何根据TableB中的ID获取TableA中的所有记录

如何根据TableA中的ID获取TableB中的所有记录

3如何在表A或表B中插入,然后在连接表中进行适当的插入以建立连接

我不是在寻找一个特定项目的解决方案,只是一些可以应用的通用示例。也许你周围有什么东西

SELECT *
FROM a
WHERE id IN (SELECT aid FROM ab WHERE bid = 1234)

要插入,这取决于您的数据库,例如主键是来自序列、自动生成还是以其他方式生成,或者只是复合键。但你只需要:

对于这些数据:

INSERT INTO a VALUES (...)
对于关系:

INSERT INTO ab VALUES (...)
一, 选择tableA.*从tableA中加入tableA.id=tableA\u B.idA上的tableA\u B 其中,tableA_B.idB=somevalue

二, 选择tableB.*从tableB左侧连接tableB.id=tableA_B.idB上的tableA_B 其中tableA_B.idA=somevalue

3 insert取决于您的数据库,但是insert到a,insert到b,然后insert到a_b;即使在表上有约束,它也应该以这种方式工作


提示:不要在运算符中使用1/2

我要做的第一件事是建议使用ORM-like or,它将为您的数据模型提供对象表示,这使得处理复杂的事情(如多对多CRUD操作)变得更加简单

如果ORM不是您的工具集的一部分,那么在SOL中会是这样的

Users UserAddresses Addresses ======= ============= ========= Id Id Id FirstName UserId City LastName AddressId State Zip 我们的表是这样连接的:

Users.Id -> UserAddresses.UserId Addresses.Id -> UserAddresses.AddressId 基于Addresses.Id的用户中的所有记录 基于Users.Id的地址中的所有记录
要根据B中的键获取表A中的所有记录(英语),您需要表A中具有该表B键的联接记录的记录 假设tableA_B有两个外键col,TabAFK和TabBFK

  Select * from TableA A
  Where pK In (Select Distinct TabAFK From tableA_B
                Where TabBFK = @TableBKeyValue)
另一个方向也是一样

  Select * from TableB B
  Where pK In (Select Distinct TabBFK From tableA_B
                Where TabAFK = @TableAKeyValue)
若要插入新记录,请根据需要在表a和表B中正常插入。。。连接表table a_B中的插入只是来自两个主表的两个pk

   Insert TableA (pk, [other columns]) Values(@pkValue,  [other data)
   Insert TableB (pk, [other columns]) Values(@pkValue,  [other data)
-然后为存在的每个关联插入联接表

  Insert tableA_B (TabAFK, TabBFK)  Values(@PkFromA,  @PkFromB)  

好的,那么有无连接都可以做到这一点?在连接的第二个示例中,是否有必要写入SELECT a.*SELECT where In通常比SELECT where exists SELECT*from a where exists SELECT*from b where a.Id=b.aId和b.Id=1234这解决了我的选择问题,但我在更新连接表方面有点困难。最聪明的方法是什么?我必须将WHERE子句同时设置为现有的Userid和Addressid,对吗?我试过使用临时表,但语法似乎不正确。是的。您需要将wehere子句设置为现有Userid和Addressid@Micah如果我像这样编写第一个查询:选择Users.*FROM Users internal JOIN UserAddresses ON Users.Id=UserAddresses.UsersID UserAddresses.AddressId=Addresses.IdWHERE Addresses.Id=@AddressId可以吗?返回什么?
  Select * from TableB B
  Where pK In (Select Distinct TabBFK From tableA_B
                Where TabAFK = @TableAKeyValue)
   Insert TableA (pk, [other columns]) Values(@pkValue,  [other data)
   Insert TableB (pk, [other columns]) Values(@pkValue,  [other data)
  Insert tableA_B (TabAFK, TabBFK)  Values(@PkFromA,  @PkFromB)