[英]SQL - Query for Matching Rows in Current Month to All Previous Data
我有一個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'
)
您似乎想要這樣的東西:
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月的記錄創建一個臨時表。
怎么樣
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”行的年份較小或月份較小。 當數字表示日期或部分日期時,也更容易匹配。 我使用此答案將月份名稱轉換為其數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.