Mysql SQL两次引用同一个表
我一直在修补SQL,为一家企业开发一个数据库,我有一个表,它通过主键引用另一个表,但由于不同的原因这样做了两次。我可以这样做吗?更重要的是,我应该这样做吗 比如说,我们为其他公司修理汽车,我们有一个关于我们工作的每辆汽车的数据库。我们为一家名为Lots-o-Rental cars的公司和另一家名为Cool cars的公司修理汽车 现在,虽然酷车有自己的汽车可供选择,但他们也与Lots-o-Rental汽车公司达成了协议,可以借用他们的一些汽车。有些情况下,我们会对我们在一辆车上所做的工作收取Lots-o-Rental汽车的费用,但其他情况下,我们会对在同一辆车上所做的工作收取酷车的费用 我当前的设置(此处简化)看起来有点像: 表格:公司 列:公司id(pk)、公司名称 1、停车场出租汽车 2、酷车 表格:分支机构(用于显示同一公司的多个营业地点) 列:分支机构id(pk)、公司id(fk) 1,1 2,1 3,2 表格:汽车 列:汽车识别码(pk)、汽车品牌、汽车型号、车主识别码(fk)、出租人识别码(fk) “所有者id”和“承租人id”都是分支机构表中的分支机构id。 “on_hire”是一个值,用于确定汽车当前是否租给我们服务的另一家公司 1号,福特,野马,1号,是的,3号 2,大众,甲虫,1,不,无效 3,日产,脉冲星,2,否,无效 4,雪佛兰,卡马罗,3,不,空Mysql SQL两次引用同一个表,mysql,database,foreign-keys,primary-key,Mysql,Database,Foreign Keys,Primary Key,我一直在修补SQL,为一家企业开发一个数据库,我有一个表,它通过主键引用另一个表,但由于不同的原因这样做了两次。我可以这样做吗?更重要的是,我应该这样做吗 比如说,我们为其他公司修理汽车,我们有一个关于我们工作的每辆汽车的数据库。我们为一家名为Lots-o-Rental cars的公司和另一家名为Cool cars的公司修理汽车 现在,虽然酷车有自己的汽车可供选择,但他们也与Lots-o-Rental汽车公司达成了协议,可以借用他们的一些汽车。有些情况下,我们会对我们在一辆车上所做的工作收取Lo
使用此布局,我可以选择汽车品牌、汽车型号、车主id(显示为公司名称)吗?如果汽车被出租,还可以显示承租人id(显示为公司名称)?在这种情况下,两次引用主键对我来说似乎很好。一种可能的替代方法是取消租用时的
,因为hiree\u id==NULL
基本上意味着不租用时的
。您应该可以获得所需的信息。在这个场景中两次引用主键对我来说似乎很好。一种可能的替代方法是取消租用时的
,因为hiree\u id==NULL
基本上意味着不租用时的
。你应该可以得到你想要的信息。是的,你可以这样做。在同一个表(
)中有两个不同的外键列(
和
)引用同一个表(
)是完全有效的
只要每个外键的“域”相同,就可以这样做。(域是该列的一组允许值。)您遇到麻烦的地方是您希望允许(例如)“酷车”成为“承租人”,但不允许它成为“车主”。然后,数据库强制执行这种约束是非常重要的。只要公司
中的每一行都是“承揽人”和“所有人”的有效参考,就可以了
跟进
Q:我将使用什么SQL语句来显示汽车品牌、汽车型号、公司名称“Owned by”和公司名称“Hired by”
A:您的SELECT语句需要对公司
表进行两次引用
由于查询中对company
表的两个引用中的列的引用将是不明确的,因此我们必须限定列引用,并且对company表的至少一个引用将要求我们分配一个别名来消除引用的歧义。(这是一个示例,它演示了我们的模式,即始终为查询中的表引用分配别名,并限定所有列引用。)
跟进
我道歉。我完全错过了分支
表。查询还需要引用该表
SELECT c.car_brand
, c.car_model
, o.company_name AS `Owned By`
, h.company_name AS `Hired by`
FROM cars c
LEFT
JOIN branch bo
ON c.owner_id = bo.branch_id
LEFT
JOIN company o
ON bo.company_id = o.company_id
LEFT
JOIN branch bh
ON c.hiree_id = bh.branch_id
LEFT
JOIN company h
ON bh.company_id = h.company_id
ORDER
BY c.car_brand
, c.car_model
, o.company_name
, h.company_name
是的,你能做到。在同一个表(
)中有两个不同的外键列(
和
)引用同一个表(
)是完全有效的
只要每个外键的“域”相同,就可以这样做。(域是该列的一组允许值。)您遇到麻烦的地方是您希望允许(例如)“酷车”成为“承租人”,但不允许它成为“车主”。然后,数据库强制执行这种约束是非常重要的。只要公司
中的每一行都是“承揽人”和“所有人”的有效参考,就可以了
跟进
Q:我将使用什么SQL语句来显示汽车品牌、汽车型号、公司名称“Owned by”和公司名称“Hired by”
A:您的SELECT语句需要对公司
表进行两次引用
由于查询中对company
表的两个引用中的列的引用将是不明确的,因此我们必须限定列引用,并且对company表的至少一个引用将要求我们分配一个别名来消除引用的歧义。(这是一个示例,它演示了我们的模式,即始终为查询中的表引用分配别名,并限定所有列引用。)
跟进
我道歉。我完全错过了分支
表。查询还需要引用该表
SELECT c.car_brand
, c.car_model
, o.company_name AS `Owned By`
, h.company_name AS `Hired by`
FROM cars c
LEFT
JOIN branch bo
ON c.owner_id = bo.branch_id
LEFT
JOIN company o
ON bo.company_id = o.company_id
LEFT
JOIN branch bh
ON c.hiree_id = bh.branch_id
LEFT
JOIN company h
ON bh.company_id = h.company_id
ORDER
BY c.car_brand
, c.car_model
, o.company_name
, h.company_name
谢谢你。把它打出来让我意识到“雇佣”专栏是多余的。谢谢你。典型的