我用父數據顯示一個網格,如果存在相關的子行,則需要顯示圖標。 我的數據庫在SQL Server 2008中。讓我簡化了,我有以下兩個表 -簡單的SQL來檢查父項是否有任何子行
訂單(PK:ID)
文件(PK:寫到FileID,FK:訂單)
的Order
可以有零或更多與它相關的文件。 File
表有一列OrderID
,其中包含FK參考Order
。現在,我正在顯示一個網格,其中列出了所有Orders
,並且我想要顯示一個圖標圖像,指示Order
是否有任何子行(文件)。
這裏有一個取巧的辦法我已經試驗,但不知道它是如何有效的/可擴展性 -
SELECT DISTINCT o.ID, o.OrderNum, ...
,(CASE f.ID/f.ID WHEN 1 THEN 1 ELSE 0 END) as FilesExist
...
FROM Order AS o LEFT OUTER JOIN dbo.FileHeader as f ON f.OrderID = o.ID
的CASE
聲明似乎需要很好地工作。如果存在一個或多個文件,則返回1,否則爲0.如果存在多個文件行,則它將嘗試重複已添加了DISTINCT的Order
行,並且我不選擇f.ID
,而是選擇f.ID/f.ID
其中將爲1(它存在)和0爲空(不存在)。我已經瞭解到JOIN優於內聯SELECT COUNT(*)
聲明。
我已經測試過,它能正常工作,但我需要專家意見,並且需要確保這是做這件事的最佳方式。這是一個非常簡單的例子,但我的SELECT
語句很複雜,因爲有很多查找,並且它將成爲一個昂貴的獲取,所以我需要確保它的可擴展性。
謝謝。
EDIT#1: 總括 - 要麼將是內部SELECT用COUNT(*)
SELECT c.ClaimNo,(SELECT COUNT(*) FROM dbo.FileHeader AS f WHERE f.ClaimID = c.ID) AS FilesHExist
FROM dbo.Claim AS c
或LEFT OUTER JOIN方法我已經提到過。
SELECT DISTINCT c.ClaimNo, (CASE fh.ID/fh.ID WHEN 1 THEN 1 ELSE 0 END) AS FilesHExist
FROM dbo.Claim AS c LEFT OUTER JOIN dbo.FileHeader AS fh ON fh.ClaimID = c.ID
連接的查詢執行計劃的兩個圖像。請建議哪一個更好。
你正在使用什麼類型的SQL?另外它似乎是一個左外連接到'文件'會產生'NULL'值,這是由''dbo.FileHeader'用'ISNULL()'來處理?還有,你的意思是'f.ID/o.ID'?顯然'f.ID/f.ID'會*總是* == 1? – Gibron
我的數據庫在SQL Server 2008中。我的想法是當JOIN產生一個NULL值時有0。所以,如果它存在,f.ID/f.ID將始終爲1,如果它爲NULL,則始終爲0。這就是CASE聲明所暗示的 - 它不需要包含任何中間SELECT *或COUNT語句即可達到目的。 –
請標記答案是,如果你有答案 –