【问题标题】:SQL Left Join 2 Tables where ConditionSQL Left Join 2 表 where 条件
【发布时间】:2014-06-24 21:32:36
【问题描述】:

我有 2 个表:AllClients 和 AllPolicies。我正在尝试查找没有“活动策略”的客户记录。有效保单是生效日期在今天之前而到期日期在今天之后的保单。这是我想出的sql,但它不会执行:

SELECT ac.LookupCode
  FROM AllClients ac
  LEFT JOIN AllPolicies ap 
    ON ap.LookupCode = ac.LookupCode
   AND ap.EffectiveDate  < '2014-06-24'
   AND ap.ExpirationDate > '2014-06-24'

我正在使用 mySQL,但遇到了一些奇怪的“未知表状态:TABLE_TYPE”错误。我相当有信心我的 SQL 语句是垃圾;)感谢您的帮助!

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:
    SELECT LookupCode
    FROM AllClients
    where LookupCode not in 
        (select LookupCode 
        from AllPolicies
        where EffectiveDate < '2014-06-24' and ExpirationDate > '2014-06-24')
    

    【讨论】:

    • 这可行,但速度非常慢。有关如何加快速度的任何建议?
    • 尝试在两个表中的 Lookupcode 列上创建一个索引 CREATE INDEX > ON >
    • 我确实索引了两个表中的这些列,但我仍然遇到问题。还有其他提高性能的想法吗?
    【解决方案2】:

    这可能会有所帮助。您没有详细说明您的 mySQL 错误,它们可能与您的表结构或服务器设置有关。

    SELECT
     ac.LookupCode
    FROM
     AllClients ac
     LEFT JOIN AllPolicies ap ON ap.LookupCode = ac.LookupCode
      AND ap.EffectiveDate < @Today
      AND ap.ExpirationDate > @Today
    WHERE
     ap.LookupCode IS NULL --This means do not get records that have active policies
    

    【讨论】:

    • 我得到了同样的错误信息。确切的错误消息是:“未知表状态:TABLE_TYPE”。我很想解释一下,但这就是错误消息中显示的全部内容。在引发该错误之前,查询会执行很长时间。感谢您迄今为止的帮助!
    • 这也是为我提供具有有效策略的帐户,而不是具有无效策略的帐户。我相信错误消息与 phpmyadmin 有关,所以这有点无关紧要。
    【解决方案3】:
    > SELECT AllClients.LookupCode FROM AllClients Left Join AllPolicies on
    > AllPolicies.LookupCode = AllClients.LookupCode
    >      and date(AllPolicies.EffectiveDate) < date '2014-06-24'
    >      and date(AllPolicies.ExpirationDate) > date '2014-06-24';
    

    【讨论】:

    • 这给了我有有效政策的帐户,而不是没有有效政策的帐户。
    【解决方案4】:

    故障排除如下。从这个开始:

    select ac.*
    from AllClients ac
    where 1 = 2
    

    如果运行成功,就前进到这里

    select ac.LookUpCode
    from AllClients ac
    where 1 = 2
    

    然后这个:

    select ac.LookUpCode
    from AllClients ac left AllPolicies ap on 1 = 2
    where 1 = 2
    

    继续前进,一次添加一点。一旦遇到错误,您就会知道是什么原因造成的。

    【讨论】:

    • 谢谢,但我认为该错误与 phpmyadmin 和显示问题有关。
    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多