VFP查找在另一个表中也存在的记录

时间:2018-08-25 07:38:41

标签: sql visual-foxpro

我想从当前期间有发票的客户表中查找记录(表Dayb)。我已经从另一个程序复制了此代码,但是-由于我的无知-可能正在使它变得很糟糕并且使用了错误的构造。

SELECT Account, Common_name FROM Customer;
   WHERE EXISTS (SELECT Account FROM DayB WHERE DayB.Account = Cust.Account) ;
   INTO CURSOR T1

感谢您的建议;并可以推荐一个简单的SQL指南。

谢谢。安德鲁

1 个答案:

答案 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可能是其中最好的一种。