2014-10-30 28 views
0

我已經瀏覽了互聯網,但大多數我遇到的示例只解釋如何與用戶輸入形成關係。我正在尋找的是類似下面的東西:創建與上傳數據的多對多關係

表1

 -----ID--------NAME----------- 
      1  Bill Smithers 
      2  Steve oneguy 
      3  Mike Michaels 
     ------------------------------- 

表2

 ----ID------Number--------charges------ 
      1 111-111-1111  $1.01 
      2 111-111-1111  $2.00 
      3 222-222-2222  $3.00 
      4 333-333-3333  $ .50 
      5 111-111-1111  $2.50 
      6 222-222-2222  $1.75 
     ---------------------------------------- 

結果連接表後應該是這樣的:

 -----Name-------------Number-------------Charges----- 
     Bill Smithers  111-111-1111  $1.01 
     Bill Smithers  111-111-1111  $2.00 
     Steve Oneguy  222-222-2222  $3.00 
     Mike Michaels  333-333-3333  $ .50 
     Bill Smithers  111-111-1111  $2.50 
     Steve Oneguy  222-222-2222  $1.75 
    ------------------------------------------------------- 

現在我知道需要有一個保存關係的第三個表格,但不需要手動輸入關係我不知道如何讓兩張桌子相應地相配。我將承擔第三個表需要最終是這樣的:

 -----Name_ID-----------DATA_ID--------- 
       1    1 
       1    2 
       2    3 
       3    4 
       1    5 
       2    6 
     --------------------------------------- 

源數據已經進來看起來像這樣:

 -----Name-------------Number-------------Charges----- 
     Bill Smithers  111-111-1111  $1.01 
     Bill Smithers  111-111-1111  $2.00 
     Steve Oneguy  222-222-2222  $3.00 
     Mike Michaels  333-333-3333  $ .50 
     Bill Smithers  111-111-1111  $2.50 
     Steve Oneguy  222-222-2222  $1.75 
    ------------------------------------------------------- 

,但我想補充一些優化,因爲該表最終會變得更大。

+0

對不起 - 你能澄清你實際問的是什麼嗎?是的,對於多對多,常見的解決方案是加入表格;如果您的源數據未提供匹配項,則必須手動輸入。 – 2014-10-30 17:11:44

回答

0

你的應用程序應該有一個單一的glob數據,是否正確?每次有人添加金額時,他們都使用他們的電話號碼?通過這種方式,您可以讓應用程序爲人員提交數據,然後通過電話/付款,從兩者中獲取ID,然後將其發送到第三張表格中。或者,您可以將所有作品提交給SP,並讓SP使用輸出ID,因爲您的應用程序不關心。

這不是我怎麼會佈置(如電話號碼,可以爲特定人發生變化,使他們差標識符),但如果你正在尋找一個解決方案,已每個實例傳遞給SP,並有SP做重複檢查姓名,插入捐款,最後(使用兩個ID)建立關係。

0

你好像在說,你從你取得/提取/蒸餾表1,表2和表3這樣,當你把/重組他們結果是等於源表源。

源/結果可能有重複的行,因爲相同的名稱,數量&成本可能出現多次。爲了查詢關係,表應該被設計爲沒有重複。否則,查詢結果並不意味着,當有沒有重複他們的意思是直截了當的事情。談論這樣的行列表而不是行集合也更加複雜。標準SQL JOIN甚至沒有被定義爲在有重複輸入時給出任何特定的結果。

每個源/結果行對應一個調用。您實際上可能打算擁有更多的電話媒體資源列,以免重複。否則,您可以通過Using AUTO_INCREMENT獲得唯一的呼叫ID。我將引用一個表格值呼叫,它看起來像來源/結果,並帶有一個唯一的呼叫ID列。你真的應該使用Call而不是Source/Result。

  • 呼叫就是「用ID [ID]調用是由名爲[名稱]到號[編號]與負責收費情況的人」
  • 表1是行,其中「[ID]標識的行名稱[名稱]「。
  • 表2是「呼叫[ID]用電荷[充電]」編號爲[號碼]的行。
  • 表3是「名稱爲id [Name_ID]的人致電[DATA_ID]」的行。

當我們從表中插入數字和成本時,auto_increment會生成一個新的ID值。我們可以將該值視爲Call中對應行的ID值。

當我們將來自Source的相應名稱插入到Table1中,但它們尚未包含在其中時,auto_increment會爲每個(新)名稱生成一個新ID。

Obtaining Auto-Increment Values我們可以在表3中插入相應的ID和DATA_ID對。

現在讓我們重新構建Call and Source/Result。回想一下,電話是哪裏

  • 行「與ID叫[ID]是由名爲[名稱]的人號[編號]與負責收費情況:」

這樣稱呼是行其中

  • 「存在一個名_ID其中
    [名_ID]標識名稱[名稱]
    和名稱與編號[名_ID]發出呼叫[DATA_ID]
    被點名的人和CALL [DATA_ID]爲與數[號碼]具有電荷[電荷]」

所以呼叫是(通過置換表1,表2和表3爲他們的謂詞按照上述子彈/語句)

SELECT DATA_ID,Name,Number,Charge 
FROM Table1 n 
JOIN Table3 t ON n.ID=Name_ID 
JOIN Table2 d ON DATA_ID=d.ID 

我們通過

-- keep duplicates 
SELECT Name,Number,Cost 
FROM Call 

從電話得到的結果所以結果是

-- keep duplicates 
SELECT Name,Number,Charge 
FROM Table1 n 
JOIN Table3 t ON n.ID=Name_ID 
JOIN Table2 d ON DATA_ID=d.ID