【发布时间】:2014-03-05 22:41:21
【问题描述】:
在这里很沮丧。我不是数据库管理员,但可以解决。我正在针对我们只能查看访问的 Progress OpenEdge 数据库编写一些 ODBC 查询。最长的时间没有问题,直到最近他们改变了数据结构,谁知道为什么,他们将客户电话号码移动到自己的名为“联系人”的表中,而在他们进入“cif”之前,地址等仍然保留.
他们没有为每个客户创建一行并为每个电话号码创建字段,而是使用 0-4、号码/电子邮件和客户的代码。因此,如果客户有 4 个电话号码,则他们有 4 行不同的代码、联系人字段和客户姓名重复。
我正在尝试将“联系人”表与“cif”表连接起来,这样无论在“cif”中列出多少次,它都会返回“cif”中提到的每个客户,但包括所有关联的电话号码来自每一行的“联系人”。
表结构简化如下:
Table "contact"
code | contact(#) | customer
--------------------------------
0 | (123)456-7890 | ABC Corp
1 | (123)456-7891 | ABC Corp
0 | (987)654-3210 | CBA Inc
Table "cif"
customer | b_in_low | b_in_high
----------------------------------
ABC Corp | 50.45 | 134.66
ABC Corp | 64.45 | 188.99
CBA Inc | 12.56 | 890.33
我要返回的是“cif”中每一行的连接行,但包含“contact”中的所有数字,因此上表将返回:
rsRow1) ABC Corp, 0, (123)456-7890, 1, (123)456-7891, 50.45, 134.66
rsRow2) ABC 公司, 0, (123)456-7890, 1, (123)456-7891, 64.45, 188.99
rsRow3) CBA Inc, 0, (987)654-3210,,, 12.56, 890.00
我不想要的:
rsRow1) ABC Corp, 0, #, 50.45, 134.66
rsRow2) ABC Corp, 1, #, 50.45, 134.66
rsRow3) ABC Corp, 0, #, 64.45, 188.99
rsRow4) ABC Corp, 1, #, 64.45, 188.99
rsRow5) CBA Inc, 0, #, 12.56 | 890.00
有意义吗?我可以让它在“cif”表上由一个 rs 工作,并在每个重复区域期间,使用“cif.customer”作为 WHERE 过滤器对“联系人”执行另一个查询,但显然它非常慢并且可能会导致数以千计的查询。
我可以让它只从“cif”返回 1 行,但从“contact”只返回 1 个号码
或
我可以让它返回最多 5 个重复的“cif”行,每个行有 5 个不同的电话号码。
简而言之,如何在列出“联系人”中的所有 +-5 电话号码的同时有效地从“cif”中获取 1 行?
【问题讨论】:
-
如果不在结果端编写一些代码以将行转换为列,我看不到一种方法。
-
这就是我来到这里的原因 Tim :D 我最终使用 ajax 来拉入一个格式化页面以获取它自己的联系信息。至少目前是这样。可以很好地满足我们的需求,并且比将第二个记录集放入第一个记录集要快得多,即使它本质上是在做同样的事情。
-
预期结果是否正确?与 ABC Corp 并列的 2 不应该是 1 吗?所以:ABC Corp, 0, (123)456-7890,1,(123)456-7891,50.45,134.66
-
你是对的 Ronald...typo...2 行都应该是 1。更新了 OP
标签: mysql sql odbc progress-4gl openedge