【发布时间】:2016-05-28 02:33:43
【问题描述】:
我有一个基表,我想再加入 2 个表来获取我需要的所有数据。运行查询时,我得到一个笛卡尔积,因为其中 2 个表(主表和我要加入的另一个表)正在通过 non-unique 键加入。
这是一个例子:
发票 (i)
id order_id name comment
-----------------------------------------------------------------
1 500 Males Mice
2 500 Females Mice
3 500 Courier Fee Within City
订单(o)
id order_number
------------------------------
500 AN5246516264
订购商品 (oi)
id order_id strain_id species_id comments
-----------------------------------------------------------------
1100 500 858 9876 Mice
1101 500 858 9876 Mice
1102 500 NULL NULL Within City
使用上面定义的表,这是我的查询:
查询
SELECT
i.name, i.comment,
o.order_number,
oi.strain_id, oi.species_id
FROM invoice i
LEFT JOIN order o
ON i.order_id = o.id
LEFT JOIN order_items oi
ON o.id = oi.order_id
运行查询后,我得到一个笛卡尔积,如下所示(不一定按顺序):
name comment order_number strain_id species_id
-----------------------------------------------------------------------
Males Mice AN5246516264 858 9876 ---> I want this row
Males Mice AN5246516264 858 9876
Males Within City AN5246516264 NULL NULL
Females Mice AN5246516264 858 9876
Females Mice AN5246516264 858 9876 ---> I want this row
Females Within City AN5246516264 NULL NULL
Courier Fee Mice AN5246516264 858 9876
Courier Fee Mice AN5246516264 858 9876
Courier Fee Within City AN5246516264 NULL NULL ---> I want this row
我了解这里发生了什么,我知道为什么它会导致笛卡尔积,但我不知道如何解决我的问题。
我只想将order_number、strain_id 和species_id 附加到Invoice (i) 表中。
是的,表格结构的构建方式有些奇怪。我确实相信数据库设计师在制作表格时已经陶醉了,但这不是我现在可以改变的。
有什么建议吗?
编辑
我查看了所有 3 个表,但找不到任何其他列可以加入它们。我留下了order_id。
【问题讨论】:
-
问题是,“如何将发票项目链接到订单项目”。理论上问这个问题,不是这里的数据库问题。实际上,没有特定的链接,即使 cmets 也不是唯一的。我能看到的唯一可能性是您假设两个表中的项目顺序相同(在这种情况下,您可以使用 orderby 尝试加入它们),或者您必须忽略发票或订单项目表,以便您不要'没有得到乘法问题。
-
您想要保留的行有什么独特之处?
-
在 @Lukos 的基础上,您可以在 Order items 表上的 order id 上排列行,并将该 rank id 连接到 invoice 表的 id。您必须检查将数据添加到这些表的过程,以确保它们按顺序插入,与 Order Items 表相同。
-
@Lukos 是的,这是个问题,因为我不知道为什么要这样构建。但我只能看到
order_id是我可以用来加入它们的唯一列。我确实需要来自所有 3 个表的数据,所以忽略其中 2 个表是不可行的。至于顺序,我不想依赖它,因为其他记录的格式可能不同。 -
当您查看该结果列表时,您如何知道在哪些结果旁边放置“---> 我想要这一行”?
标签: sql oracle join cartesian-product