连接多个表返回重复项

时间:2015-01-23 15:54:01

标签: sql sql-server select join inner-join

我正在尝试以下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行。

我也想要"哪个月"最后的条款是看上个月而不是当月,但也在努力。

我对此有点新意,所以我希望它有道理。

由于

3 个答案:

答案 0 :(得分:1)

如果每列上的重复行相同,您可以使用DISTINCT关键字来消除这些重复项。

但我认为您应该重新考虑您的JOINWHERE条款,因为必须有重复的原因:

  1. WHERE子句命中table2中的几行,在单个empid
  2. 上具有相同的月份
  3. 在其中一个表中有几行具有相同的empid
  4. 以上都是真的
  5. 您可能希望通过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吗?