2014-10-30 62 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