簡體   English   中英

SQL-查詢當月與所有先前數據的匹配行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM