我有一个表有两个需要从查询中搜索的字段(custno和custno2)。我没有设计这张桌子,所以不要尖叫我。 :-) 我需要找到所有记录,其中custno或custno2与基于titleno的同一个表上的查询返回的值匹配。
换句话说,用户在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 :(得分:1)
一个简单的快速提升可能是将你的'union'更改为'union all'(我是一个sql server的人 - 这是否适用于其他dbs?)
否则,它可能需要一些特定于数据库的技巧 - 您正在使用哪个数据库?
答案 1 :(得分: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 != '')
答案 2 :(得分:0)
这呼吁正确的正常化。如果您有同一帐单的多个客户,则它们应位于相关表中。当你有像custno,custno2这样的字段时,你通常会遇到需要修复的设计问题。