sql - 连接多个表返回重复项

标签 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 行。

我还希望最后的“where Month”子句查看上个月而不是当前月份,但也为此苦苦挣扎。

我对此有点陌生,所以我希望它有意义。

谢谢

最佳答案

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

但我认为您应该重新考虑您的 JOINWHERE 子句,因为这些重复肯定是有原因的:

  1. WHERE 子句在单个 empid 上命中 table2 中具有相同月份的多行
  2. 其他表之一中有几行具有相同的 empid
  3. 以上均属实

您可能希望通过 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/

相关文章:

c# - SQL 查询中的期初余额和期末余额中的期末结果不正确?

powershell - 选择对象 - 我可以选择什么?

sql - 是否可以将选择字段分配给 PostgreSQL 中的变量?

sql - 使用数据库表作为队列

sql-server - SQL Server Express 无法连接错误 : 28 - Server doesn't support requested protocol

sql - 使用 tSQL 计算多个表中的行数

php - 在mysql中获取有条件的行位置

sql - 如何在关系数据库中存储自定义实体属性

sql - 我如何询问随时间变化的百分比

php - MySQL 在插入之前进行检查