2013-10-23 30 views
0

我嘗試執行查詢,但它顯示的數據超過5次。下面是我用記錄在查詢中顯示的次數超過5次

ALTER procedure [dbo].[dddddd] 
    @userid int 
as 
    SELECT DocumentInfo.DocID as DocumentID, 
     dbo.DocumentInfo.DocName as DocumentName, 
     dbo.DocumentInfo.Uploadfile as FileUploaded, 
     dbo.DocType.DocType as Document, 
     dbo.Department.DepType as Department, 
     dbo.ApproveType.ApproveType AS ApproveID 
    FROM dbo.DocumentInfo 
     inner JOIN dbo.DocType ON dbo.DocumentInfo.DocTypeID=dbo.DocType.DocTypeID 
     inner JOIN dbo.Department ON dbo.DocumentInfo.DepID=dbo.Department.DepID 
     LEFT JOIN dbo.ApproveType ON dbo.ApproveType.approveid=dbo.Department.DepID 
     LEFT OUTER JOIN Approval a ON a.DocID = a.DocID 
     JOIN ApproveType at ON at.ApproveID = ISNULL(a.Approveid, 3) 
    where [email protected] 

看到這個結果查詢..

DocumentID DocumentName FileUploaded Document Department ApproveID 
    8 SDASDASD dsfsdf.docx MSWord Human Resource NULL 
    8 SDASDASD dsfsdf.docx MSWord Human Resource NULL 
    8 SDASDASD dsfsdf.docx MSWord Human Resource NULL 
    8 SDASDASD dsfsdf.docx MSWord Human Resource NULL 
    8 SDASDASD dsfsdf.docx MSWord Human Resource NULL 
    8 SDASDASD dsfsdf.docx MSWord Human Resource NULL 

    9 dr reprt n analysis HR.docx MSWord Human Resource NULL 
    9 dr reprt n analysis HR.docx MSWord Human Resource NULL 
    9 dr reprt n analysis HR.docx MSWord Human Resource NULLL 
9 dr reprt n analysis HR.docx MSWord Human Resource NULL 
9 dr reprt n analysis HR.docx MSWord Human Resource NULL 
    10 hr report HR.docx MSWord Human Resource NULL 
10 hr report HR.docx MSWord Human Resource NULL 
10 hr report HR.docx MSWord Human Resource NULL 
10 hr report HR.docx MSWord Human Resource NULL 

哪裏是錯誤的?

+1

「5次」有什麼神奇之處?我猜你需要一些額外的連接條件來過濾出無關的組合。 –

+0

我的意思是保存在表中的記錄...當我創建這個sp然後記錄顯示我超過5個時間.. – user2883796

+0

在哪裏我插入記錄只有1次,但它顯示了5次1記錄@DStanley – user2883796

回答

1

我猜,但此行不看的權利:

LEFT JOIN dbo.ApproveType ON dbo.ApproveType.approveid=dbo.Department.DepID 

approveidDepID真的是一回事嗎?

+0

當我試試這個... LEFT JOIN dbo.ApproveType ON dbo.ApproveType.approveid = dbo.DocumentInfo.ApproveID它總是顯示我超過5倍的記錄 – user2883796

1

您顯然在您沒有正確加入的某個連接中有1:N關係。解決此問題的一種方法是包含更多列,並查看哪些列具有不適用於您的查詢的不同值。

例如(完整的猜測):

LEFT JOIN dbo.ApproveType ON dbo.ApproveType.approveid=dbo.Department.DepID 

請問這種回報所有批准了特定部門?您是否需要過濾僅用於指定文檔的批准?

0

我爲解決這些問題所做的第一件事就是找到加入的第一個共享ID並檢查它。因此,如果您找回所有包含dbo.DocumentInfo.DocTypeID = 7的5條記錄,請對dbo.DocType進行選擇,其中DocTypeID = 7。你有5個答案。如果沒有,則轉到下一個連接,從DepartmentID =(無論是重複)中選擇Department中的數據,直到找到複製數據的連接。然後弄清楚表是如何加入1-1加入而不是1 - M.

1

您的連接正在帶回多行...不能提供確切的答案,但找到引起它的連接:

SELECT * 
FROM dbo.DocumentInfo 
    inner JOIN dbo.DocType ON dbo.DocumentInfo.DocTypeID=dbo.DocType.DocTypeID 
    inner JOIN dbo.Department ON dbo.DocumentInfo.DepID=dbo.Department.DepID 
    LEFT JOIN dbo.ApproveType ON dbo.ApproveType.approveid=dbo.Department.DepID 
    LEFT OUTER JOIN Approval a ON a.DocID = a.DocID 
    JOIN ApproveType at ON at.ApproveID = ISNULL(a.Approveid, 3) 
where documentid = 8 

這將帶回您有問題的5條記錄以及文檔8的所有列。查看每個值並驗證這些是重複行。如果您發現列的5行有不同的值,那麼您的表格會導致額外的行。重新訪問並添加新邏輯,將其限制爲一行而不是5.

另一種方法是逐個註釋每個表,然後重新運行。如果你得到相同數量的行,那麼這個表是好的......如果你註釋掉一個表並得到1行,那麼你已經找到了哪個表導致了額外的行,並且你需要在你的連接中添加新的邏輯把它降到一行。

+0

我做了這個,並檢查每一行,但在每一行它始終顯示相同的記錄 – user2883796

+0

有多少行select * from dbo.documentInfo where documentid = 8 return? – Twelfth

+0

29行,但在這裏我發佈較少的記錄,但在許多數據庫中它顯示我29條記錄。 – user2883796