【问题标题】:VFP Find records which also exist in another tableVFP 查找也存在于另一个表中的记录
【发布时间】:2018-08-25 07:38:40
【问题描述】:

我想从客户表中查找当前期间有发票的记录(表 Dayb)。我从另一个程序复制了这段代码,但是 - 在我的无知中 - 可能会造成恶劣天气并使用错误的构造。

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

感谢您的建议;你能推荐一个简单的 SQL 指南吗?

谢谢。安德鲁

【问题讨论】:

    标签: sql visual-foxpro


    【解决方案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)。其中部分检查这些客户记录是否也存在于 DayB 中,具体取决于常见字段 Account。如果您还将 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
    

    和 INNER JOIN:

    SELECT Customer.Account, Customer.Common_name FROM Customer ;
       INNER JOIN DayB ON DayB.Account = Customer.Account ;
       INTO CURSOR T1 ;
       NOFILTER
    

    然而,最后一个重复来自客户的每一行的次数与 DayB 中的匹配次数一样多。当您也需要来自 DayB 的字段时,通常会使用该字段。

    在性能方面,EXISTS 可能是其中最好的一个。

    【讨论】:

    • 我喜欢这个答案,我想知道是否应该将“设置精确”设置为真以获得最佳效果?
    • @Hank,精确设置在 SQL 语句中无效。要获得 set exact ON 的效果,您需要设置 set ANSI ON。无论设置 ANSI 设置如何,都可以通过运算符 ==(而不是 =)获得完全匹配。
    • 感谢您的回复,Cetin - 抱歉,已经离开了。你的笔记很有用。在别名的问题上,我当然会使用它们。但是样本太短了,可能几乎不需要它!我将进一步尝试 INNER JOIN - 希望它可能是众多 JOIN 中最简单的一种感谢您的指导
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多