这里很沮丧。我不是数据库管理员,但可以绕过。我正在针对我们只有视图访问权限的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行?
答案 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。