【问题标题】:Why are query results duplicated? SQL Server为什么查询结果重复? SQL 服务器
【发布时间】:2017-04-29 18:07:55
【问题描述】:

我正在尝试编写查询。我只想返回一行,但我的查询返回了多个重复的行。

我的查询如下

SELECT
    LOWER(M.UserID) AS EmpID,
    ISNULL(M.DispName, '') AS UserName,
    ISNULL(C.CompCode, '') AS CompCode,
    ISNULL(D.DispName, '') AS DeptName,
    ISNULL(D.DispName, '') AS DispName,
    ISNULL(R.RankCode, '') AS RankCode,
    M.SortOrder AS UserOrder,
    R.SortOrder AS RankOrder,
    ISNULL(J.JobCode, '') AS JobCode
FROM 
    tb_User M WITH(NOLOCK)
INNER JOIN 
    tb_Dept D WITH(NOLOCK) ON M.MainDeptCode = D.DeptCode
INNER JOIN 
    tb_Company C WITH(NOLOCK) ON M.CompCode = C.CompCode
INNER JOIN 
    tb_Rank R WITH(NOLOCK) ON M.RankCode = R.RankCode
INNER JOIN 
    tb_Duty DT WITH (NOLOCK) ON M.DutyCode = DT.DutyCode
LEFT OUTER JOIN 
    tb_Job J WITH (NOLOCK) ON M.JobCode = J.JobCode 
WHERE 
    MainDeptCode = '1000' AND M.DisplayYN = 'Y'
ORDER BY
    RankOrder, JobCode, DispName

结果如下:

EmpID UserName CompCode DeptName DispName RankCode UserOrder RankOrder JobCode 
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0
0001  ryden    1000     ceo       ceo      1         0          0

如何解决该查询?请帮帮我。

【问题讨论】:

  • 在不知道表的架构和内容的情况下无法帮助您。
  • 结果可能仅与您实际选择的列重复。
  • 您的JOINs 之一将是一对多关系。换句话说,JOIN 谓词将是非唯一的
  • 设置Bad Habits to kick - putting NOLOCK everywhere - 不推荐在任何地方使用它 - 恰恰相反!
  • M.JobCode 的值是多少?显示选择中的值。

标签: sql-server tsql duplicates


【解决方案1】:

“快速而肮脏”的方法是将DISTINCT 添加到SELECT 查询中 -

SELECT DISTINCT * FROM....

但这并不能真正解决问题。

正确的方法是找出原因。如果不知道这些表中的数据,就无法分辨。最常见的原因是您连接的表之一有多个与连接条件匹配的行,但它们在SELECT 中未包含的列中有所不同(因此它们似乎没有任何不同) .

要解决这个问题,请注释掉所有联接(以及它们在 SELECT 中的关联列)并将它们一一添加,以查看哪个表添加了多行。然后,您可以从该表中选择所有列,以根据您选择加入的条件准确查看匹配的行以及匹配的原因。

确定行后,您需要制定一组新的JOINWHERE 子句以排除所有不需要的其他行。

这在大多数情况下应该对您有所帮助,但是对于某些架构,您可能需要做一些更复杂的事情(子查询、公用表表达式等)。

【讨论】:

    【解决方案2】:

    如果您的输出中有多行,则问题是您的一个表有多行,或者您没有正确连接它。我会打电话给select * 看看这是哪张桌子。在你的情况下,我相信它是表tb_Duty,因为你没有使用它。

    【讨论】:

    • 尽管我的解释不确定,但你明白了这一点......是的,我检查了我的表和连接查询,最后我发现连接是错误的。感谢您的回答
    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多