我有一个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'
)
答案 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将月份名称转换为其数字。