题
哇,很难找到这个主题的简单解释。简单的多对多关系。
三个表,tableA、tableB 和一个联结表A_B。
我知道如何使用键等建立关系,但是当执行 INSERT、UPDATE 和 DELETE 查询时我有点困惑......
基本上,我正在寻找的是一个显示以下内容的示例:
如何根据TableB中的ID获取TableA中的所有记录
如何根据TableA中的ID获取TableB中的所有记录
3 如何在 TableA 或 TableB 中插入,然后在联结表中进行适当的 INSERT 以建立连接。
我并不是在寻找针对特定项目的解决方案,只是寻找一些可以应用的一般示例。也许你周围有什么东西?
解决方案
我要做的第一件事是推荐使用像 Linq 到 Sql 或者 NHibernate 这将为您提供数据模型的对象表示,从而使处理复杂的事情(例如多对多 CRUD 操作)变得更加简单。
如果 ORM 不是您的工具集的一部分,那么它在 SOL 中的外观如下。
Users UserAddresses Addresses ======= ============= ========= Id Id Id FirstName UserId City LastName AddressId State Zip
我们的表是这样连接的:
Users.Id -> UserAddresses.UserId Addresses.Id -> UserAddresses.AddressId
- Users中基于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)
- Addresses中所有记录基于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)
其他提示
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 (...)
要根据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)
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