我正在尝试以下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行。
我也想要"哪个月"最后的条款是看上个月而不是当月,但也在努力。
我对此有点新意,所以我希望它有道理。
由于
答案 0 :(得分:1)
如果每列上的重复行相同,您可以使用DISTINCT
关键字来消除这些重复项。
但我认为您应该重新考虑您的JOIN
或WHERE
条款,因为必须有重复的原因:
您可能希望通过WHERE / JOIN中的条件而不是DISTINCT
关键字来排除这些重复行,因为当某些数据在原始结果集的单行中发生更改时,可能会出现意外行为。然后你又开始重复了一次。
您可以通过以下条款检查日期是否在上个月:
date BETWEEN dateadd(mm, -1, datefromparts(year(getdate()), month(getdate()), 1))
AND datefromparts(year(getdate()), month(getdate()), 1)
此语句使用DATEFROMPARTS
创建当前月份的开头两次,使用DATEADD
(在上个月的开头生成)从第一个月减去一个月并检查是否{{ 1}}使用date
在这些日期之间。
答案 1 :(得分:1)
如果您的查询返回重复项,则一个或多个表具有重复的empid
值。这是数据问题。您可以通过以下查询找到它们:
select empid, count(*)
from table1
group by empid
having count(*) > 1;
您应该真正修复数据和查询,以便返回您想要的内容。您可以使用select distinct
进行绷带解决方案,但我通常不建议这样做。有些东西导致重复,如果你不明白为什么,那么查询可能不会返回你期望的结果。
至于你的where
条款。根据你的逻辑,表达这一点的正确方法包括年份:
where year(table2.datefrom) = year(getdate()) and
month(table2.datefrom) = month(Getdate())
虽然还有其他方法可以表达与索引更兼容的逻辑,但您可以继续使用以下方法:
where year(table2.datefrom) * 12 + month(table2.datefrom) = year(getdate()) * 12 + Month(Getdate()) - 1
也就是说,将月份转换为从零开始的几个月,然后使用月算术。
如果您关心索引,那么您当前的where
子句将如下所示:
where table2.datefrom >= dateadd(day,
- (day(getdate) - 1),
cast(getdate() as date) and
table2.datefrom < dateadd(day,
- (dateadd(month, 1, getdate()) - 1),
cast(dateadd(month, 1, getdate()) as date)
答案 2 :(得分:0)
在distinct
select
关键字,以消除查询中的重复项
与上个月相比稍微复杂一些。这取决于你的意思:
如果报告于2015年1月23日运行,您想要01/12 / 2014-31 / 12/2014或23/12 / 2014-22 / 01/2015吗?