我想从当前期间有发票的客户表中查找记录(表Dayb)。我已经从另一个程序复制了此代码,但是-由于我的无知-可能正在使它变得很糟糕并且使用了错误的构造。
SELECT Account, Common_name FROM Customer;
WHERE EXISTS (SELECT Account FROM DayB WHERE DayB.Account = Cust.Account) ;
INTO CURSOR T1
感谢您的建议;并可以推荐一个简单的SQL指南。
谢谢。安德鲁
答案 0 :(得分:1)
我认为复制的SQL语句对它的要求是正确的。
SELECT Account, Common_name FROM Customer ;
WHERE EXISTS (SELECT * FROM DayB WHERE DayB.Account = Customer.Account) ;
INTO CURSOR T1 ;
NOFILTER
在这里,您正在从客户中选择2个字段(帐户和Common_Name)。 part会根据通用字段Account检查那些客户是否也在DayB中记录了EXISTS。如果您也将Customer别名为cust,则Cust.Account是正确的。即:
SELECT Account, Common_name FROM Customer Cust;
WHERE EXISTS (SELECT * FROM DayB WHERE DayB.Account = Cust.Account) ;
INTO CURSOR T1 ;
NOFILTER
经常使用此别名,以使游标的别名更短。
在EXISTS检查中,选择的内容并不重要,可以是Select Account,Select *甚至是Select 1之类的常量。无论在那里,无论如何都没有选择,EXISTS子句仅检查存在性并返回一个布尔值。
最后,作为经验法则,我们在此处添加了NOFILTER,以防止对行进行过滤并创建所谓的“真实游标”。
现在,多一点底漆。当需要检查另一个表中也存在的行时,基本上有3种SQL构造可以做到这一点。
如上所述进行EXISTS检查。
使用IN子句:
SELECT Account, Common_name FROM Customer ;
WHERE Account in (SELECT Account FROM DayB) ;
INTO CURSOR T1 ;
NOFILTER
和内部联接:
SELECT Customer.Account, Customer.Common_name FROM Customer ;
INNER JOIN DayB ON DayB.Account = Customer.Account ;
INTO CURSOR T1 ;
NOFILTER
但是,最后一天将与DayB中的匹配重复来自客户的每一行。当您也需要DayB中的字段时,经常使用该字段。
在性能方面,EXISTS可能是其中最好的一种。