2013-10-23 58 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