SQL加入具有一对多关系的多个表而没有“重复”

时间:2018-05-15 23:00:13

标签: sql duplicates one-to-many

首先让我先说我确实知道这些不是重复的行。我理解连接多个表的基本功能。我只是想知道是否有办法在SQL中做我想做的事情,我不知道更好的方法来标题。

示例表:

Day Table
Day_KEY Day_Label
1       Mon
2       Tues
3       Wed
4       Thur

EstHours Table
EstHours_KEY Day_KEY Est_Hours
1            1       2
2            1       1
3            1       3

ActHours Table
ActHours_KEY Day_KEY Act_Hours
1            1       3
2            1       2
3            1       2

示例查询:

select *
from Day
join EstHours on EstHours.Day_KEY = Day.Day_KEY
join ActHours on ActHours.Day_KEY = Day.Day_KEY

结果:

Day_KEY Day_Label EstHours_KEY Day_KEY Est_Hours ActHours_KEY Day_KEY Act_Hours
1       Mon       1            1       2         1            1       3
1       Mon       1            1       2         2            1       2
1       Mon       1            1       2         3            1       2
1       Mon       2            1       1         1            1       3
1       Mon       2            1       1         2            1       2
1       Mon       2            1       1         3            1       2
1       Mon       3            1       3         1            1       3
1       Mon       3            1       3         2            1       2
1       Mon       3            1       3         3            1       2

期望的结果:

Day_KEY Day_Label EstHours_KEY Day_KEY Est_Hours ActHours_KEY Day_KEY Act_Hours
1       Mon       1            1       2         1            1       3
1       Mon       2            1       1         2            1       2
1       Mon       3            1       3         3            1       2

我尝试过:

1)
查询:

select *
from (
    select *, row_number() over (partition by Day.Day_KEY order by EstHours_KEY) as rn
    from Day
    join EstHours on EstHours.Day_KEY = Day.Day_KEY) rt
join (
    select *, row_number() over (partition by Day_KEY order by ActHours_KEY) as rn
    from ActHours) on ActHours.Day_KEY = Day.Day_KEY and EstHours.rn = ActHours.rn

结果:

Day_KEY Day_Label EstHours_KEY Day_KEY Est_Hours ActHours_KEY Day_KEY Act_Hours
1       Mon       1            1       2         1            1       3
1       Mon       2            1       1         2            1       2
1       Mon       3            1       3         3            1       2

这是我需要的,除非EstHours的行数少于ActHours,在这种情况下,它会将这些行从ActHours中删除。

2)
查询:

select *, null, null, null
from Day
join EstHours on EstHours.Day_KEY = Day.Day_KEY

union

select Day.*, null, null, null, ActHours.*
from Day
join ActHours on ActHours.Day_KEY = Day.Day_KEY

结果:

Day_KEY Day_Label EstHours_KEY Day_KEY Est_Hours ActHours_KEY Day_KEY Act_Hours
1       Mon       1            1       2         null         null    null
1       Mon       2            1       1         null         null    null
1       Mon       3            1       3         null         null    null
1       Mon       null         null    null      1            1       3
1       Mon       null         null    null      2            1       2
1       Mon       null         null    null      3            1       2

这就是我想要的,除了我希望值在同一行上,因此单个Day_KEY的最大行数将是EstHours或ActHours的最大行数,以较多者为准。

有没有人知道如何做到这一点?我是不是错了?

1 个答案:

答案 0 :(得分:0)

听起来你需要一个'组。具有属于' one'的唯一/不同字段的子句表中的一对多关系。比如一行id。

select * from table_a,table_b,table_c group by table_a.rowid

这会将结果折叠为table_a中的不同行,并且还允许选择结果在table_b或table_c的字段中使用/包括聚合函数,例如sum()。

在我使用的示例中,考虑table_b和table_c中的每一行与返回的table_a的唯一行重叠。