gpt4 book ai didi

SQL 不等式加入返回的笛卡尔积

转载 作者:行者123 更新时间:2023-12-04 22:22:37 27 4
gpt4 key购买 nike

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

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 盒子。谢谢。

最佳答案

您希望应用以下条件:

    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

关于SQL 不等式加入返回的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16154180/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com