2010-03-31 137 views
1

我有一個表有兩個字段(custno和custno2),需要從查詢中進行搜索。我沒有設計這張桌子,所以不要尖叫我。 :-) 我需要找到所有記錄,其中custno或custno2與基於titleno的同一個表上的查詢返回的值相匹配。需要幫助調整SQL語句

換言之,用戶在1234中鍵入titleno。我的查詢搜索該表以查找與titleno關聯的custno。它也爲該titleno尋找custno2。然後,它需要在同一張表上搜索所有其他記錄,這些記錄在custno或custno2字段中的前一次搜索中爲其他記錄返回了custno或custno2。

這裏是我想出來的:

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC 
FROM TRCDBA.BILLSPAID 
WHERE CUSTNO IN 
(select custno from trcdba.billspaid where titleno = '1234' 
    union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '') 
OR CUSTNO2 IN 
(select custno from trcdba.billspaid where titleno = '1234' 
    union select custno2 from trcdba.billspaid where titleno = '1234' and custno2 != '') 

查詢大約需要5-10秒鐘返回數據。它可以被重寫爲更快的工作嗎?

+0

對於什麼數據庫(版本以及)? – 2010-03-31 16:34:16

+0

該表可以同時填寫custno和custno2嗎? – 2010-03-31 16:39:11

回答

1

一個簡單快速的提升可能是您的「聯盟」更改爲「UNION ALL」(我是一個SQL Server的傢伙 - 這並不適用於其他DBS)

否則,它可能需要一些DB-具體技巧 - 你使用哪個數據庫?

+0

+1我同意,'聯盟所有'應該給一些好處。 – 2010-03-31 16:40:37

0

另外,在您提出的解決方案中,您將針對titleno = 1234的BILLSPAID表過濾四次。根據您的數據庫平臺,具有重複的titleno的項目數量以及是否對titleno進行索引,您可能會通過使用臨時表格獲得顯着提升。再次,根據您的平臺,這可能看起來像這樣:

SELECT * FROM TRCDBA.BILLSPAID INTO MyTempTable 
WHERE titleno = '1234'; 

SELECT BILLYR, BILLNO, TITLENO, VINID, TAXPAID, DUEDATE, DATEPIF, PROPDESC 
FROM MyTempTable 
WHERE CUSTNO IN 
(select custno from MyTempTable 
    union all select custno2 from MyTempTable where custno2 != '') 
OR CUSTNO2 IN 
(select custno from MyTempTable 
    union all select custno2 from MyTempTable where custno2 != '') 
+0

如果您打算使用臨時表,您可能需要將custno和custno2的不同值以減少子查詢爲單個表選擇。 – 2010-03-31 17:00:27

0

這就要求適當的規範化。如果您有同一賬單的多個客戶,他們應該在相關的表格中。當你有像custno,custno2這樣的字段時,你通常會遇到需要修正的設計問題。

+0

你在向合唱團傳道。我沒有設計這些。我只需訪問我的網絡應用程序的數據。 – user338413 2010-03-31 18:02:52