2009-07-20 67 views
1

我有一張表可能有數千(可能是幾百萬?)的記錄。它基本上是一個存儲特殊日誌條目的審計跟蹤表。它被稱爲「日誌」。在單個查詢中選擇主記錄及其所有相關的外部詳細記錄?

還有一個名爲「LogsExtended」的相關表,它爲Logs表中的每個條目存儲零個或多個附加記錄。

有一個外鍵關係的設置,完成刪除級聯等

我做在日誌表中的SELECT選擇發生在一個特定的時間範圍內的所有記錄,說:「過去30天」 。

但是我想以某種方式同時在LogsExtended表中選擇相關的外部記錄。意圖將此查詢的結果填充到具有適當DataRelation設置的DataSet中。

我嘗試過使用各種JOIN子句,但是這些都傾向於導致錯誤的行爲 - LogsExtended表中每個相關記錄的日誌條目都會重複。

我真的想要避免顯而易見的回退解決方案,即首先查詢Logs表,然後對每個結果運行附加查詢以獲取LogsExtended記錄。這讓我感到非常浪費,並可能導致數千個查詢正在運行。

我想我正在做一個這樣的小山,但我無法弄清楚。

謝謝。

回答

1

你需要使用一個左連接,否則將無法顯示記錄來自沒有項目int LogExtended的日誌。作爲這樣

DECLARE @StartDate DATETIME, 
     @EndDate DATETIME 

SELECT @StartDate = '01 Jun 2009', 
     @EndDate = '30 Jun 2009' 

SELECT * 
FROM Logs l LEFT JOIN 
     LogsExtended le ON l.LogID = le.LogID 
WHERE l.Date BEYWEEN @StartDate AND @EndDate 

如果你想2的結果集,你需要執行查詢作爲

DECLARE @StartDate DATETIME, 
     @EndDate DATETIME 

SELECT @StartDate = '01 Jun 2009', 
     @EndDate = '30 Jun 2009' 

SELECT l.* 
FROM Logs l 
WHERE l.Date BEYWEEN @StartDate AND @EndDate 

SELECT le.* 
FROM Logs l INNER JOIN 
     LogsExtended le ON l.LogID = le.LogID 
WHERE l.Date BEYWEEN @StartDate AND @EndDate 

這將返回日期之間的所有日誌,然後爲同一原始日誌所有擴展日誌設置

1

一對多關係中連接的本質是將「一個」表中的行乘以「many」表的倍數。你可以一起去一個選項是從日誌表只佔用了LOGID,連同從LogsExtended表中的所有信息休息:

SELECT L.ID, E.* 
FROM Logs L, LogsExtended E 
WHERE 
L.ID = E.ID 
AND 
(Some date limitation on the Logs table) 
+0

雖然這會導致「一個」表字段的重複,但如果需要在單個SQL查詢/語句中執行,這可能是最好的方法。 – CraigTP 2009-07-20 10:56:00

+0

因此除了返回大量重複記錄之外,沒有辦法做到這一點? 只要我沒有錯過這裏的一個竅門 - 那很好。 我想現在的問題是,在我的.NET應用程序中將這個「平面二維」數據轉換爲三維數據的最佳方式是什麼?目前,我已經提出了一個即興解決方案,它將重複條目彙總到一個條目中,同時將「LogsExtended」信息累積到一個集合中。 – nbevans 2009-07-20 11:02:01

相關問題