我有一個數據庫,其中有數百個記錄已被復制。但是,重復的信息在所有字段中都不相同。對于任何兩行,第一行將包含一些字段中的信息,而重復行的字段為空;但對于其他字段,重復(第二)行將包含信息,而第一行的字段為空。例如,它看起來像這樣:使用SQL(VBA/ADO)命令填充來自重復記錄的相應非空值的NULL字段
ID Deleted Reference Name Case_Date Outcome Outcome_Date
100 False A123 Chris 2000-01-01 Yes
101 False A123 Chris 2000-03-31
ID列是記錄的唯一主鍵。 參考欄是我可以識別重復項的那一欄。 但是,正如您所看到的,第一個記錄(100)包含Case_Date和Outcome中的信息,但第二個記錄(101)包含Outcome_Date。
我想要做的是將大量信息復制到每對記錄中的一個中,然后將復制標記為已刪除(我使用軟刪除,而不是實際從表格中刪除記錄,但只是將Duplicate列標記為True)。與上面的例子中,我希望它看起來像這樣:
ID Deleted Reference Name Case_Date Outcome Outcome_Date
100 False A123 Chris 2000-01-01 Yes 2000-03-31
101 True A123 Chris (2000-01-01)* (Yes)* 2000-03-31
技術上講,它不會是必要的也是信息復制到記錄的空白字段刪除其將被標記,但我想它是更容易復制一切,然后將“第二”記錄標記為重復記錄,而不是試圖找出哪一個包含更多信息,哪個包含更少信息。
我也知道,為每列運行單獨的SQL命令要比嘗試一次全部執行它們更容易。上面顯示的列是一個簡化示例,每列中可能存在或不存在的信息不同。
我的設置重復的記錄SELECT查詢語句是:
SELECT *
FROM [Cohorts]
WHERE [Deleted] = False
AND ([CaseType] = "Female" OR [CaseType] = "Family")
AND [Reference] Is Not Null
And [Reference] In (SELECT [Reference] FROM [Cohorts] As Tmp
WHERE [Deleted] = False
AND ([CaseType] = "Female" OR [CaseType]="Family")
GROUP BY [Reference]
HAVING Count(*) > 1)
ORDER BY [Reference];
這將在表[客群組]其中存在有相同的參考多條記錄返回所有(女/家庭)記錄(以及記錄未被標記為刪除的地方)。
我通過ADO從VBA運行我的查詢,因此可以執行UPDATE語句。我的數據庫是使用JET引擎的Access兼容的.mdb。
感謝任何人都可以建議一個合適的SQL命令,我可以運行每列為了填充NULL字段與相關重復記錄的非NULL字段的值。目前這超出了我對SQL的理解!謝謝。
+0
還沒有添加為答案,因為它不是一個完整的答案 - 使用您的示例表減去ID&Deleted字段,這將返回一個包含其他5個字段的所有信息的單個記錄:'SELECT DISTINCT * FROM(SELECT DISTINCT NZ(T1.Reference,T2.Reference)AS F1,NZ(T1.sName,T2.sName)AS F2,NZ(T1.Case_Date,T2.Case_Date)AS F3,NZ(T1.Outcome,T2.Outcome) AS F4,NZ(T1.Outcome_Date,T2.Outcome_Date)AS F5 FROM群組T1 T1 INNER JOIN群組T2 T2 ON T1.Reference = T2.Reference)WHERE NOT F1 is NULL and NOT F2 is NULL NOT NOT F3 is NULL and NOT F4 IS NULL而不是F5是NULL' –