查询多对多关系中的示例

时间:2009-01-06 13:47:47

标签: sql-server-2005 many-to-many

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

三个表,tableA,tableB和一个联结表A_B。

我知道如何使用密钥和所有设置关系,但是当执行INSERT,UPDATE和DELETE查询时,我会感到有点困惑....

基本上,我正在寻找的是一个显示的例子:

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

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

  3. 3如何在TableA或TableB中插入,然后在联结表中进行适当的INSERT以建立连接..

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

4 个答案:

答案 0 :(得分:6)

我要做的第一件事就是建议使用像Linq-To-SqlNHibernate之类的ORM,它会为你提供数据模型的对象表示,这使得处理像many-to这样的复杂事物变得更加简单。 - 很多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
  • 的用户中的所有记录
SELECT        Users.*
FROM            Addresses INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         Users ON UserAddresses.UserId = Users.Id
WHERE        (Addresses.Id = @AddressId)
  • 基于Users.Id
  • 的地址中的所有记录
SELECT        Addresses.*
FROM            Addresses INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         Users ON UserAddresses.UserId = Users.Id
WHERE        (Users.Id = @UserId)

答案 1 :(得分:1)

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

SELECT a.*
FROM a
JOIN ab ON a.id = ab.aid
WHERE ab.aid = 12345

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

对于那些数据:

INSERT INTO a VALUES (...)

对于这段关系:

INSERT INTO ab VALUES (...)

答案 2 :(得分:1)

要根据B中的键获取表A中的所有记录(英文版),您需要表A中具有该TableB键的Join记录的记录 (假设tableA_B有两个外键列,(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)

要插入新记录,请根据需要在TableA和TableB中进行正常插入...插入连接表(tableA_B)只是两个主表中的两个pk

   Insert TableA (pk, [other columns]) Values(@pkValue,  [other data)
   Insert TableB (pk, [other columns]) Values(@pkValue,  [other data)

- 然后为每个存在的关联插入Join表...

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

答案 3 :(得分:0)

1) select tableA。* from tableA join tableA_B on tableA.id = tableA_B.idA tableA_B.idB = somevalue

2) select tableB。* from tableB left join tableA_B on tableB.id = tableA_B.idB tableA_B.idA = somevalue

3)insert取决于你的数据库,但插入a,插入b,然后插入a_b;即使对表有限制,也应该这样。

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