【问题标题】:Only SELECT rows where the date is less than a date from another table仅选择日期小于另一个表中的日期的行
【发布时间】:2021-06-14 03:09:14
【问题描述】:

我正在重构一些 SQL 以删除存在于多个 OR 条件中的硬编码日期,作为 INSERT INTO 语句的一部分。

例如:

OR ( site = 'site.com' AND url = 'www.someurl.com' AND date < '2021-01-01')
OR ( site = 'site.com' AND url = 'www.otherurl.com' AND date < '2019-09-09')

site = 'site.com' 始终保持不变。

url = 'www.someurl.com' 会有不同的网址

日期也会改变。

为了删除像上面那样存在的几行,我创建了一个参考表,其中包含一个站点名称列表、一个用于标记有趣 url 的布尔列和日期(与硬编码的相同) )

除了 AND 日期

我遇到了一个子查询兔子洞,内容如下:

OR (site = 'site.com' AND url IN ( SELECT url_ref
                                       FROM REF_TABLE
                                       LEFT JOIN TABLE A
                                       ON url = url_ref) AND date < ( SELECT start_date  
                                                                         FROM REF_TABLE
                                                                         LEFT JOIN TABLE A
                                                                         ON url = url_ref ) )

我能够消除另一个包含 url 列表但没有日期的大型 OR 语句。我被困在这几种情况下,我只需要获取日期小于某个日期的行,如参考表中所定义。

这样工作:

            OR (ref.intersting = 't' AND url NOT IN ( SELECT url_ref
                                                         FROM REF_TABLE
                                                         WHERE url_ref IS NOT NULL ) )

谢谢!

附言这样做的目的是让我可以在每次创建新异常时停止编辑 python 脚本。相反,我只需在引用表中添加一行,脚本不需要更改。

【问题讨论】:

    标签: sql postgresql subquery conditional-statements


    【解决方案1】:

    你可以使用EXISTS:

    OR
    (outer.site = 'site.com' AND 
     EXISTS (SELECT 1
             FROM REF_TABLE r
             WHERE outer.url = r.url AND
                   outer.date < r.date
            )
    ) 
    

    outer 是外部查询中列的表别名。

    【讨论】:

    • 我认为这已经奏效了!我将运行几个测试来确认,但这看起来像是答案。谢谢!
    • @Vaulto 。 . .如果这确实回答了您的问题,您可以接受答案。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多