我正在尝试以下 select 语句,包括 4 个表中的列。但结果每行返回 4 次,我确信这是因为我有多个左连接,但我尝试了其他连接,但无法获得所需的结果。
select table1.empid,table2.name,table2.datefrom, table2.UserDefNumber1, table3.UserDefNumber1, table4.UserDefChar6
from table1
inner join table2
on table2.empid=table1.empid
inner join table3
on table3.empid=table1.empid
inner join table4
on table4.empid=table1.empid
where MONTH(table2.datefrom) = Month (Getdate())
我需要它来返回没有任何重复项的数据,因此每个条目只有 1 行。
我还希望最后的“where Month”子句查看上个月而不是当前月份,但也为此苦苦挣扎。
我对此有点陌生,所以我希望它有意义。
谢谢
最佳答案
如果每列上的重复行都相同,您可以使用 DISTINCT
关键字来消除这些重复项。
但我认为您应该重新考虑您的 JOIN
或 WHERE
子句,因为这些重复肯定是有原因的:
- WHERE 子句在单个 empid 上命中 table2 中具有相同月份的多行
- 其他表之一中有几行具有相同的 empid
- 以上均属实
您可能希望通过 WHERE/JOIN 中的条件(而不是 DISTINCT
关键字)排除这些重复行,因为当原始结果集中的单行中的某些数据发生更改时,可能会出现意外行为。然后你又开始出现重复的 empid。
您可以通过以下子句检查日期是否在上个月:
date BETWEEN dateadd(mm, -1, datefromparts(year(getdate()), month(getdate()), 1))
AND datefromparts(year(getdate()), month(getdate()), 1)
此语句使用 DATEFROMPARTS
创建当前月份的开始时间两次,使用 DATEADD
从第一个月份中减去一个月(结果为上个月的开始时间) )并使用 BETWEEN
检查 date
是否在这些日期之间。
关于sql - 连接多个表返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28113692/