进步OpenEdge,ODBC,记录集,加入,天哪



在这里很沮丧。我不是数据库管理员,但可以四处走动。我正在写一些针对Progress OpenEdge数据库的ODBC查询,我们只能访问该数据库的视图。在最长的一段时间里,没有出现任何问题,直到最近他们更改了数据结构,不知为什么,他们将客户的电话号码移到了自己的名为"联系人"的表中,而在他们进入"cif"之前,地址等仍然保留在那里。

他们没有为每个客户创建一行的"联系人"表,也没有为每个电话号码创建字段,而是使用0-4、号码/电子邮件和客户的代码。因此,如果一个客户有4个电话号码,则会有4行不同的代码、联系人字段和重复的客户姓名。

我正试图将"contact"表与"cif"表连接起来,这样无论在"cif中列出多少次,它都会在"civ"中返回每一个提到的客户,但在每一行中都包括与"联系人"相关的所有电话号码。

简化的表格结构是这样的:

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)美国广播公司,0,(123)456-7890,1,(123,456-7891,50.45134.66

rsRow2)美国广播公司,0,(123)456-7890,1,(123,456-7891,64.45188.99

rsRow3)CBA公司,0,(987)654-3210,,,12.56,890.00

我不想要的:

rsRow1)美国广播公司,0,#,50.45134.66

rsRow2)美国广播公司,1,#,50.45134.66

rsRow3)美国广播公司,0,#,64.45188.99

rsRow4)美国广播公司,1,#,64.45188.99

rsRow5)CBA公司,0,#,12.56 | 890.00

有道理吗?我可以让它在"cif"表上运行一个rs,在每个重复区域中,使用"cif.customer"作为WHERE过滤器对"contact"执行另一个查询,但显然它非常慢,可能会导致数千个查询。

我可以让它从"cif"只返回1行,但从"contact"只返回1个号码

我可以让它返回多达5个重复的"cif"行,每个行有5个不同的电话号码。

简而言之,如何在列出"联系人"的所有+-5个电话号码的同时,有效地从"cif"中获得1行?

这个怎么样:

SELECT c.customer
, ISNULL(c1.code,'')
, ISNULL(c1.contact,'')
, ISNULL(c2.code,'')
, ISNULL(c2.contact,'')
, ISNULL(c3.code,'')
, ISNULL(c3.contact,'')
, ISNULL(c4.code,'')
, ISNULL(c4.contact,'')
, ISNULL(c5.code,'')
, ISNULL(c5.contact,'')
, c.b_in_low
, c.b_in_high
FROM CIF AS c
LEFT OUTER JOIN Contact AS c1
ON c1.customer = c.customer
AND c1.code = 0
LEFT OUTER JOIN Contact AS c2
ON c2.customer = c.customer
AND c2.code = 1
LEFT OUTER JOIN Contact AS c3
ON c3.customer = c.customer
AND c3.code = 1
LEFT OUTER JOIN Contact AS c4
ON c4.customer = c.customer
AND c4.code = 1
LEFT OUTER JOIN Contact AS c5
ON c5.customer = c.customer
AND c5.code = 1

它取决于字段"代码"的类型返回的内容,如果您希望它为空,则可能需要进行另一次翻译。

不漂亮,但我认为它有效。

SQL server中有一个XML选项,允许您获取多个结果,并将它们合并为单个字段中的串联字符串。它是STUFF FOR XML PATH命令。这是我如何使用它的一个例子。

SELECT call_number,  item_number,
REPLACE(REPLACE(STUFF((SELECT DISTINCT ',','''' 
+ CONVERT(VARCHAR(20), item_line) + '**‘ 
+ item_number + '**‘ + work_code + ''''
FROM stage_call_item_detail s
WHERE h.source_system_code = s.source_system_code
AND h.domain_code = s.domain_code
AND h.call_number = s.call_number
AND s.site_code IS NOT NULL
ORDER BY 2
FOR XML PATH(''))
,1, 1, '‘)  ,'<item_number>',''''),'</item_number>','''') call_line_item_list, *
FROM stage_ssm_call_history h
WHERE call_number = 'A1014-01'

构建查询时可以使用缓冲区吗?

如果可以的话,你可以做一些类似的事情:

定义缓冲区联系人A。。。contactN表示联系人。

FOR EACH cif WHERE cif.customer = "ABC Corp",
FIRST contact OF cif OUTER-JOIN,
FIRST contactA OF cif WHERE ROWID(contactA) <> ROWID(contact) OUTER-JOIN,
...
FIRST contactN of cif
WHERE ROWID(contactN) <> ROWID(contact) 
AND ROWID(contactN) <> ROWID(contactA)
...

这不是一个好的解决方案,性能可能会受到严重影响。。。只有当你的联系人数量有限,比如0-4人时,这才有效。

最新更新