进步OpenEdge,ODBC,记录集,加入,哦我的

时间:2014-03-05 22:41:22

标签: mysql sql odbc progress-4gl openedge

这里很沮丧。我不是数据库管理员,但可以绕过。我正在针对我们只有视图访问权限的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 Corp,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过滤器对“contact”执行另一个查询,但显然它非常慢并且可能导致潜在的成千上万的疑问。

我可以让它只从“cif”返回1行,但只从“contact”

返回1

我可以让它返回5条重复的“cif”行,每行包含5个不同的电话号码。

简而言之,如何从“联系人”列出所有+ -5电话号码时,如何有效地从“cif”获取1行?

3 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分: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'

答案 2 :(得分:0)

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

如果可以的话,你可以这样做:

定义缓冲区contactA ... 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。