我正在尝试编写查询。我想只返回一行,但我的查询返回多个重复的行。
我的查询在
之下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
如何修复该查询?请帮帮我。
答案 0 :(得分:2)
“快速而肮脏”的方式是将DISTINCT
添加到SELECT
查询 -
SELECT DISTINCT * FROM....
但这实际上并没有解决问题。
正确的方法是找出原因。如果不知道这些表中的数据,就无法分辨。最常见的原因是您加入的其中一个表具有多个与连接条件匹配的行,但它们在SELECT
中未包含的列中有所不同(因此它们似乎不是任何一个不同)。
要完成此操作,请注释掉所有连接(及其在SELECT中的关联列)并逐个添加它们,以查看哪个表正在添加多行。然后,您可以选择该表中的所有列,以根据您选择加入的条件确切地查看匹配的行以及原因。
确定行后,您需要制定一组新的JOIN
或WHERE
子句,以排除您不想要的所有其他行。
在大多数情况下,这应该可以帮到你,但是你可能需要做一些更复杂的模式(子查询,公用表表达式等)。
答案 1 :(得分:1)
如果输出中有多行,则问题是您的某个表有多行,或者您没有正确加入它。我会打电话给select *
看看这是哪张桌子。在您的情况下,我认为它是表tb_Duty
,因为您没有使用它。