我浏览了互联网,但我遇到的大多数例子都只解释了如何与用户输入形成关系。我正在寻找的是下面的内容:
表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 :(得分:0)
你的应用程序应该将数据放在一个glob中,对吗?每次有人添加金额时,他们会使用自己的电话号码吗?通过这种方式,您可以让您的应用程序为人员提交数据,然后通过电话/付款,从两者中获取ID,然后可以将其发送到第三个表格中。或者,您可以将所有部分提交到SP并让SP使用输出ID,因为您的应用程序并不关心。
这不是我如何安排它(因为电话号码可能会改变给定的人,使他们成为糟糕的标识符),但如果您正在寻找解决方案,请将每个实例传递给SP ,让SP对名称进行重复检查,插入捐赠,最后(使用两个ID)设置关系。
答案 1 :(得分:0)
你似乎在说你得到一个表源,你可以从中派生/提取/提炼Table1,Table2和Table3,这样当你将它们组合/重新组合成Result时它等于Source。
源/结果可能有重复的行,因为相同的名称,数字和数字成本可能会出现多次。要以关系方式查询,应将表设计为不重复。否则,查询结果并不意味着当没有重复时它们意味着直截了当的事情。谈论这样的行列表而不是行集也要复杂得多。标准SQL JOIN甚至没有被定义为在有重复输入时给出任何特定结果。
每个源/结果行对应一个呼叫。您可能实际上打算拥有更多的调用属性列,以便没有重复项。否则,您可以Using AUTO_INCREMENT获取唯一的来电ID。我将引用一个表值Call,它看起来像Source / Result,带有一个添加的唯一调用ID列。你真的应该使用Call而不是Source / Result。
当我们将Source中的Numbers和Costs插入Table2时,auto_increment将生成一个新的ID值。我们可以将该值视为Call中相应行的ID值。
当我们从Source中将相应的Names插入到Table1中时,不会在其中插入每个(新)名称的auto_increment生成新的ID。
然后我们可以通过Obtaining Auto-Increment Values将相应的ID和DATA_ID对插入到表3中。
现在让我们重新构建呼叫和来源/结果。回想一下,Call是行
所以Call是行
所以Call是(通过将Table1,Table2和Table3替换为上述子弹的谓词/语句)
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