SQL-查询当月与所有先前数据的匹配行

时间:2018-08-30 14:21:18

标签: sql database postgresql

我有一个SSL证书数据数据库,该数据库每月更新一次。我想发出一个SQL查询,以仅从8月获得我数据库中的所有记录,证书的到期日期和购买证书的公司都与上个月匹配。

为简单起见,想象一下数据库架构如下:

Subject Organisation | Issued Date | Expiry Date | Issuing Company | Month | Year

到目前为止,我想出了一个令人困惑的地方,因为我制作了一个仅包含8月数据的新表。如果您知道一种无需创建表的方法,那就更好了。下面的查询给我一个错误,指示一个子查询返回的多个行已用作表达式。

SELECT * 
FROM AugustTable 
WHERE 
"Subject Organisation" = (SELECT 
                          "Subject Organisation" 
                          FROM AllCertsTable 
                          WHERE ("Month" != 'August' AND "Year" != '2018')
                         ) 
AND 
"Expiry" = (SELECT 
            "Expiry" 
            FROM AllCertsTable 
            WHERE ("Month" != 'August' AND "Year" != '2018')
           )

下面的查询工作正常,但我只希望将August数据或August +所有其他数据附加到底部,而不是从每个关系中合并列。

SELECT * 
FROM AllCertsTable AS A 
INNER JOIN August AS B 
ON (A."Subject Organisation" = B."Subject Organisation" 
    AND 
    A."Valid To" = B."Valid To" 
    AND 
    A."Issuing Company" = 'XYZ'
   )

2 个答案:

答案 0 :(得分:1)

您似乎想要这样的东西:

SELECT a.* 
FROM AllCertsTable a 
WHERE a."Month" = 'August' AND a."Year" = 2018 AND
      (a."Subject Organisation", a."Expiry") IN
         (SELECT "Subject Organisation", "Expiry"
          FROM AllCertsTable act
          WHERE act."Month" <> 'August' OR act."Year" <> '2018'
         ) ;

根本没有理由只为8月的记录创建临时表。

答案 1 :(得分:0)

怎么样

SELECT
  *
FROM AllCertsTable AS Aug
WHERE 1 = 1
 AND Aug."Month" = 'August'
 AND EXISTS (
   SELECT 1 FROM AllCertsTable AS Temp
   WHERE 1 = 1
    AND Temp."Subject Organisation" = Aug."Subject Organisation"
    AND ((Temp."Year" = Aug."Year" AND EXTRACT(MONTH, to_date(Temp."Month", 'Month')) < EXTRACT(MONTH, to_date(Aug."Month", 'Month'))) OR 
         (Temp."Year" < Aug."Year"))
 )

查询几乎可以自我解释。您选择每一行,在该行中存在与组织匹配的行,而“ temp”行的年份较小或月份较小。 当数字表示日期或部分日期时,也更容易匹配。我使用this answer将月份名称转换为其数字。

相关问题