我在存盤程序中有一個 int 輸入串列,每個 id 都有一個檔案,每個檔案都有多個子檔案。連接上subdocument.DocumentId = document.DocumentId。
我要做的是回傳一個物件串列(document.DocumentId int, IsValid bool)。
如果每個連接的子檔案的 2 列不為空,則 bool 為真。
PARAMLIST:ID 串列
SELECT
IDS.ParamList AS documentId,
CASE
WHEN (SELECT COUNT(*)
FROM Document D
JOIN SubDocument SD ON SD.DocumentId = D.DocumentId
WHERE SD.DocumentId = IDS.ParamList
AND SD.PaymentDate IS NULL
AND SD.ConnectionContractIsAcceptedDate IS NULL) > 0
THEN 1
ELSE 0
END AS IsValid
FROM
@documentIds IDS
正如您所看到的,我的邏輯是進行大小寫切換,其中我計算每個SubDocument沒有填充至少一列的內容,但查詢僅回傳 2 列名稱
檔案表:
| 檔案編號 | 由...制作 |
|---|---|
| 1 | 約翰 |
| 2 | 吉爾 |
子檔案表:
| 子檔案 ID | 檔案編號 | 欄位 1 | 場 2 |
|---|---|---|---|
| 3 | 1 | 空值 | 2010-02-02 |
| 4 | 2 | 2021-01-01 | 2018-03-03 |
| 5 | 1 | 2020-10-10 | 2015-11-15 |
| 6 | 2 | 2019-10-01 | 2013-12-12 |
這里的預期結果是:
| 檔案編號 | 已驗證 |
|---|---|
| 1 | 錯誤的 |
| 2 | 真的 |
uj5u.com熱心網友回復:
您可以將表變數連接到表。
然后使用條件聚合來計算 IsValid。
declare @DocumentIds table ( DocumentId int ); insert into @DocumentIds values (1),(2); SELECT Doc.DocumentId, Doc.CreatedBy , CAST(MIN( CASE WHEN (SubDoc.Field1 IS NULL OR SubDoc.Field2 IS NULL) THEN 0 ELSE 1 END) AS BIT) AS IsValid FROM Document Doc JOIN @DocumentIds Ids ON Ids.DocumentId = Doc.DocumentId LEFT JOIN SubDocument SubDoc ON SubDoc.DocumentId = Doc.DocumentId GROUP BY Doc.DocumentId, Doc.CreatedBy ORDER BY Doc.DocumentId;
| 檔案編號 | 由...制作 | 已驗證 |
|---|---|---|
| 1 | 約翰 | 錯誤的 |
| 2 | 吉爾 | 真的 |
關于db<>fiddle 的演示在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379330.html
標籤:sql sql-server 存储过程
上一篇:將列添加到特定表
