部分答案是 [here](查找包含檔案的所有 Boxes,其中所有檔案的過期日期都低于 DATE)并且它有效:
“要檢查每個箱碼的最大歸檔日期是否小于 2022-01-01,您可以使用:
SELECT b.code,
MAX(b.EXPIRATION_DATE) AS expiration_date
FROM box b
join COMPONENT_A cpp on cpp.b_Id=b.Id
join COMPONENT_Z cpt on cpt.A_Id=cpp.Id
join "FILE" f on f.Z_Id =cpt.Id
WHERE b.EXPIRATION_DATE < DATE '2022-01-01'
GROUP BY b.code
HAVING MAX(f.EXPIRATION_DATE) < DATE '2022-01-01';
"
但它也需要檔案(或盒子)沒有日期的盒子。如何避免一個檔案沒有日期或盒子本身的所有盒子?我嘗試添加一個假的外部日期:
HAVING MAX(f.EXPIRATION_DATE) < '01/01/2022';
AND NVL(min(f.EXPIRATION_DATE), to_date('01/01/1011','DD/MM/YY'))<>TO_DATE('01/01/1011','DD/MM/YY')
但
min(f.EXPIRATION_DATE)
不起作用,因為“min”取出了 null/empty,它不會將 null/empty 視為“min”。我在組中,我必須使用聚合運算式。
uj5u.com熱心網友回復:
您可以COUNT計算具有到期日期的檔案數量NULL并確保為零,并且假設每個組將有一個框并且所有行的框的到期日期都相同,那么您可以使用:
SELECT b.code,
MAX(b.EXPIRATION_DATE) AS expiration_date
FROM box b
join COMPONENT_A cpp on cpp.b_Id=b.Id
join COMPONENT_Z cpt on cpt.A_Id=cpp.Id
join "FILE" f on f.Z_Id =cpt.Id
WHERE b.EXPIRATION_DATE < DATE '2022-01-01'
GROUP BY b.code
HAVING MAX(f.EXPIRATION_DATE) < DATE '2022-01-01'
AND COUNT(CASE WHEN f.EXPIRATION_DATE IS NULL THEN 1 END) = 0;
如果一個組中可以有多個具有不同到期日期的框行,那么您可以使用:
SELECT b.code,
MAX(b.EXPIRATION_DATE) AS expiration_date
FROM box b
join COMPONENT_A cpp on cpp.b_Id=b.Id
join COMPONENT_Z cpt on cpt.A_Id=cpp.Id
join "FILE" f on f.Z_Id =cpt.Id
WHERE b.EXPIRATION_DATE < DATE '2022-01-01'
OR b.expiration_date IS NULL
GROUP BY b.code
HAVING MAX(f.EXPIRATION_DATE) < DATE '2022-01-01'
AND COUNT(CASE WHEN b.EXPIRATION_DATE IS NULL THEN 1 END) = 0
AND COUNT(CASE WHEN f.EXPIRATION_DATE IS NULL THEN 1 END) = 0;
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461914.html
上一篇:SQL查詢生成重復項
下一篇:OracleSQL觸發器未創建
