3

我在获取连接条件以隔离唯一记录时遇到问题。我的查询返回笛卡尔积,我不知道如何让它停止。我的表如下所示:

Table A         
ID_1    Start   End Name
137 1:00    2:00    Galia
137 2:00    3:00    Est
137 3:00    4:00    Omnia
137 4:00    5:00    Divisa
137 5:00    6:00    Partes
137 6:00    7:00    Tres
137 7:00    8:00    Quarum
137 8:00    9:00    Unam
137 9:00    10:00   Incolunt

Table B     
ID_1Time_1  Time_2
137 3:10    3:57

我的查询是:

select A.*, B.Time_1, B.Time_2
from Table_A A
inner join
Table_B B
on 
A.ID_1 = B.ID_1 and B.Time_1<=A.End and B.Time_2 >= A.Start

我得到的看起来像这样:

ID_1Start   End Name    Time_1  Time_2
137 1:00    2:00    Galia   3:10    3:57
137 2:00    3:00    Est 3:10    3:57
137 3:00    4:00    Omnia   3:10    3:57
137 4:00    5:00    Divisa  3:10    3:57
137 5:00    6:00    Partes  3:10    3:57
137 6:00    7:00    Tres    3:10    3:57
137 7:00    8:00    Quarum  3:10    3:57
137 8:00    9:00    Unam    3:10    3:57
137 9:00    10:00   Incolunt3:10    3:57

所以看起来它给出了两个表的笛卡尔积,考虑到每条记录都满足所有三个条件,这是有道理的。我想要的只是返回时间对应的记录,如下所示:

ID_1Start   End Name    Time_1  Time_2
137 3:00    4:00    Omnia   3:10    3:57

关于如何构建连接以实现这一目标的任何建议?如果这有助于提供可用功能,我正在开发一个 Netezza 盒子。谢谢。

4

1 回答 1

3

您希望以下条件适用:

    A.Start <= B.Time_1 <= B.Time_2 <= A.End

假设列数据类型是一致的(即仅存储时间,而不是日期时间或时间戳),并且值是一致的(即,上述多重关系中的中心谓词已经有效)。这些条件可以用 SQL 重写为

B.Time_2 <= A.End AND B.Time_1 >= A.Start

并不是

B.Time_1 <= A.End and B.Time_2 >= A.Start

这可能对应于

B.Time_1 <= A.Start <= A.End <= B.Time_2

因此:

select A.*, B.Time_1, B.Time_2
from Table_A A
inner join
Table_B B
on 
A.ID_1 = B.ID_1 and B.Time_1>=A.Start and B.Time_2 <= A.End
于 2013-04-22T18:52:18.773 回答