SQL不等连接返回笛卡尔积

4

我在使用连接条件时遇到了问题,无法得到唯一的记录。我的查询结果返回笛卡尔积,我不知道如何停止它。我的表格如下:

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功能的话,我正在使用Netezza数据库。谢谢。

1
这些时间的数据类型是什么? - Aprillion
1
3:57 >= 9:00 应该如何正确地为真? - Aprillion
2
@TomR……根据提供的数据,你的查询应该可以正常工作(即返回一行)。你确定已经包含了正确的查询和样本数据吗? - Gordon Linoff
这不是实际数据,它是专有的公司数据,我无法发布。但这个数据代表了问题。它是一个笛卡尔积,因为查询似乎是在测试是否在表中任何地方满足不等式连接,然后返回每个ID匹配的记录,从而给出IDs和名称的笛卡尔积。它返回多行,无论不等式是在连接还是在where子句中。 - TomR
我不得不尝试这个,因为我看不出有什么问题。结果如愿以偿。 - user1723033
显示剩余2条评论
1个回答

4
您希望应用以下条件:

    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

谢谢,希望你不介意我用一些解释来扩展你的答案。 - didierc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接