2014-03-05 32 views
0

在這裏很受挫。我不是數據庫管理員,但可以解決。我正在寫一些針對Progress View OpenEdge數據庫的ODBC查詢,我們只能查看該數據庫。直到最近他們改變了數據結構以及誰知道爲什麼,最長時間沒有問題,他們將客戶電話號碼轉移到他們自己的「聯繫人」表中,而在「cif」之前,地址等仍然存在。Progress OpenEdge,ODBC,記錄集,加入,哦我的

與其爲每個電話號碼的每個客戶和字段創建一行「聯繫人」表,他們使用0-4的代碼,號碼/電子郵件和客戶。所以如果客戶有4個電話號碼,他們有4行,不同的代碼,聯繫人字段和客戶名稱重複。

我試圖用「cif」表加入「contact」表,所以無論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 

我試圖返回爲每個行的接排「到岸價格」,而是包括從「接觸」,因此上表將返回所有數字:

rsRow1)ABC公司,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有限公司,0,(987)654-3210 ,,, 12.56,890.00

我不想:

rsRow1)ABC公司,0,#,50.45,134.66

rsRow2)ABC公司,1,#,50.45,134.66

rsRow3)ABC公司,0,#,64.45,188.99

rsRow4)ABC公司,1,#,64.45,188.99

rsRow5) CBA Inc,0,#,12.56 | 890.00

有意義嗎?我可以通過「cif」表上的一個rs來工作,並且在每個重複區域中,使用「cif.customer」作爲WHERE過濾器對「contact」執行另一個查詢,但顯然它非常緩慢並且會導致潛在的數以千計的查詢。

我可以讓它從「到岸價格」,但只有1號從「接觸」只返回1行

我可以得到它返回最多5重複「到岸價格」與線每個5個不同的電話號碼。

簡而言之,我如何從「cif」有效地獲得1行,同時列出來自「contact」的所有+ -5電話號碼?

+0

我看不到一種方法來做到這一點,而無需在結果側編寫一些代碼將行轉換爲列。 –

+1

這就是爲什麼我在這裏拍攝Tim:D我最終使用ajax來爲自己的聯繫信息提供一個格式化的頁面。無論如何至少現在。爲我們的需求工作得很好,並且比第一個放置第二個記錄集的速度快得多,儘管它本質上是做同樣的事情。 – user3385662

+0

預期的結果是否正確? ABC Corp公司的2號線不應該是1號嗎? So: ABC Corp,0,(123)456-7890,1,(123)456-7891,50.45,134.66 – RonaldB

回答

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的數字,這隻會工作。

+0

謝謝yursol。我最終做了什麼並且能夠滿足我們的需求就是做一個簡單的查詢並使用ajax爲每個客戶調用第二個查詢。這不是理想的,但它的工作原理,只會延遲幾秒鐘的結果。對於我們在這份報告中沒有運行但每天幾次的需求,這就足夠了。不是一個理想的解決方案,但直到我能找出一個更好,更高效的解決方案,這將成爲訣竅。 – user3385662

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

SQL服務器中有一個XML選項,可讓您獲取多個結果並將它們合併到單個字段中的連接字符串中。這是用於XML PATH命令的STUFF。這是我如何使用它的一個例子。

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' 
相關問題