2009-01-06 54 views
10

哇,很難找到對此主題的簡單解釋。簡單的多對多關係。多對多關係中的查詢示例

三個表,tableA,tableB和一個聯結表A_B。

我知道如何建立關係,鑰匙和所有的,但我得到一個有點糊塗了,當時間來執行INSERT,UPDATE和DELETE查詢....

基本上,我正在尋找是給出了一個例子:

  1. 如何獲得TableA中的所有記錄,基於TableB中的ID

  2. 如何獲得所有記錄表B中,基於在表A的ID

3如何在任一表A表B或插入,然後讓在路口表中相應的INSERT進行連接..

我不是尋找一個解決方案,以一個具體項目,只是一個幾個可以應用的通用示例。也許你有東西躺在附近?

回答

6

我會做的第一件事就是推薦使用像Linq-To-SqlNHibernate的ORM,這將給你反對你的數據模型的表示,這使得它更更簡單地處理複雜的事情,如多對多的CRUD操作。

如果一個ORM不是你的工具集的一部分,那麼這裏就是SOL中的外觀。基於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 -> UserAddresses.UserId 
        Addresses.Id -> UserAddresses.AddressId 
    
    • 所有記錄:

       
      Users  UserAddresses  Addresses 
      =======  =============  ========= 
      Id   Id    Id 
      FirstName UserId   City 
      LastName AddressId   State 
                 Zip 
      

      我們的表的連接這樣的.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
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 (...) 
+0

好了,所以它的有沒有加入可以做到這一點? 在第二個示例中(使用連接),是否有必要編寫「SELECT a。*」 – Soeren 2009-01-06 14:12:20

+0

select where()通常比選擇where exists要慢() select * from a where exists(select * from b其中a.Id = b.aId和b.Id = 1234) – 2009-01-06 14:23:08

0

1) 選擇表A *從TABLEA上tableA.id = tableA_B.idA加入tableA_B where tableA_B.idB = somevalue

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

3)insert取決於你的數據庫,但插入到a中,插入到b中,然後插入到a_b中;即使對錶格有限制,它也應該以這種方式工作。

提示:不要在操作使用1/2

1

爲了得到表A中的所有記錄基於在B鍵,英文的,要在表A中有一個加入記錄記載,表B鍵 (假設tableA_B有兩個外鍵的cols,( 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) 

要插入一個新的記錄,做一個正常的INSERT INTO表A和表B需要插入......到第j OIN表(tableA_B)只是從兩個主表

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

兩個PKS - 然後插入到表中加入對存在每個協會...

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