我们可以加入两个复合主键的两个部分在一起呢?

问题描述 投票:-1回答:3

我有两个表,都具有一个复合主键:

  1. OrderNr + CustNr
  2. OrderNr + ItemNr

我能加入与OrderNr和OrderNr每个是一个复合主键的一部分,这两个表?

sql database oracle join composite-primary-key
3个回答
1
投票

是的,但你会发现你从每个表中重复,因为它们结合起来,使一个独特的组合行。这就是所谓的笛卡尔积

Table A
OrderNr, CustNr
1,C1
1,C2
2,C1
2,C2

TableB
OrderNr,ItemNr
1,i1
1,i2


SELECT * FROM a JOIN b ON a.OrderNr = b.OrderNr

1,C1,1,i1
1,C1,1,i2
1,C2,1,i1
1,C2,1,i2

这是因为复合主键可以包含重复的元素,只要元素的组合是唯一的。接合对PK的只是其中的一部分,这部分是被重复的元件(每个表中我custnr 1重复两次,即使itemnr和CustNr意味着行是唯一的)的结果在上述乘法运算结果集 - 从A 2级的行是custnr 1,再乘以从乙是custnr 1 2行,给出总共4行

它与正常/自然连接工作过?

普通连接(INNER,LEFT OUTER,RIGHT OUTER,FULL OUTER)将加入该行从两个表或子查询时ON条件是有效的。在信中的条款就像一个WHERE子句,没错 - 因为它代表是真还是假(谓语)的声明。如果声明是真实的,行结合。你甚至不必让它关于从表中的数据 - 你甚至可以说a JOIN b ON 1=1和每一个行会得到B.加入到每一行视为注释,主键不参与加入以一切,但主键通常依赖于指标和这些指标可以用来加快加入,但他们不给它至关重要。

其他连接(CROSS,NATURAL ..)存在;交叉连接是象1 = 1上面的例子,不指定导通,从A的每一行被接合到每一行从B,由设计。 NATURAL JOIN是一个避免使用,恕我直言 - 数据库将寻找那些两个表中相同,并加入他们的列名。问题是,事情能阻止将来的工作,如果有人添加具有相同名称但不同的内容/意义的两个表的列。无严重的生产体系​​,我曾经遇到过使用了自然科学加入。你可以用一些打字脱身,如果你的列加入就被命名为相同的,在使用 - SELECT * FROM a JOIN b USING (col) - 在这里A和B都具有一个名为col列。使用具有一定的优势,尤其是在自然科学加入,因为它不一样,如果同名的另一列土崩瓦解作为现有之一,但它也有一些批评者也 - 你不能说USING(col) AND ...。大多数人只是坚持写一篇,而忘记使用

自然科学加入也没有使用主键。有没有连接样式(据我所知),将看到两个表之间的外键关系,并用其作为连接条件

然后是真的,如果我尝试加入主键和两个表的外键,它就像一个“其中”命令?

很难理解您这是什么意思,但如果你的意思是A JOIN B ON A.primarykey = B.primary_key_in_a然后它会奏效,肯定。如果你的意思A CROSS JOIN B WHERE A.primarykey = B.primary_key_in_a那么这也将工作,但它的东西,我肯定会避免 - 没有人写SQLS这种方式,与一般倾向于是放弃使用WHERE创造加盟条件(你仍然看到有人写旧校舍FROM a,b WHERE a.col=b.col的方式,但它也严重沮丧),并把它们在ON代替

因此,在总结:

SELECT * FROM a JOIN b ON a.col1 = b.col2

加入从所有行与来自B中的所有行,其中在COL1的值等于在COL2的值。不需要主键用于任何这摸出


0
投票

你可以加入任何表,如果有/它们之间的逻辑关系

select *
from t1
JOIN t2 
  on t1.ORderNr = t2.OrderNr

但如果OrderNr本身不能提供表之间唯一性,您的数据将成倍增加。

比方说,你有T1 2 OrderNr值为1和5 OrderNr与T2值1,当你加入他们的行列,您将获得2×5 = 10分的记录。


0
投票

你的数据模型类似,通常被称为“粉丝陷阱”的问题。 (如果你有一个“命令”表中只键入由OrderNr如果将正好是风扇陷阱)。

无论哪种方式,这是同样的问题 - 订单/客户和订单/项目之间的关系是模糊的。你不能告诉客户订购的项目。

这在技术上是可以加入这些表 - 你可以在任何列加入,无论他们是否是键列,或没有。问题是,你的结果可能没有意义,除非你有更多的条件和其他表,你不告诉我们。

例如,一个简单的加入只是t1.OrderNr = t2.OrderNr将返回指示相关的每个订单客户行已经下令所有相关的订单项目。如果这是你想要的,你这里有没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.