2010-03-31 134 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