【问题标题】:Join multiple tables on one specific column在一个特定列上连接多个表
【发布时间】:2016-01-04 14:50:57
【问题描述】:

我还是 SQL 新手,所以这个问题听起来可能很基础。我使用的是 Oracle 数据库,我只能使用 select。我有 2 张桌子 NamesWorksite

Names表:

ID  Full name   Type
-----------------------
1   Sibelga     Company
2   Belgacom    Company
3   Brussels    Authority
4   Etterbeek   Authority

Worksite表:

ID Worksite CompanyID   AuthorityID
-----------------------------------
12569        1              3
4563         2              4
1589         1              4
1489         1              3

基本上,我想获取每个工作地点的AuthorityCompany 的全名。

我正在尝试加入,但它只返回AuthorityCompany 的名称。我正在尝试以下查询,但它不起作用,知道我哪里出错了吗?

select  
    ID worksite, 
    Full name, 
    Full name
from    
    Worksite
join    
    Names on worksite.companyID = names.ID

【问题讨论】:

  • 如果字段在您显示时定义,Full name 您必须使用双引号,例如select ID, "Full name" from...
  • 抱歉,我不太明白你的意思。我基本上想获得每个工地的公司和管理局的全名。但是一个简单的 Join 并不能正常工作。
  • 考虑改变你的数据库设计。使用给定的设计,您可能会错误地给公司一个权威名称,反之亦然。有两张桌子,一张给公司,一张给当局。
  • 很遗憾我不是数据库设计者,我只有只读权限,必须提取信息
  • 所以我建议你请数据库设计者修改它:-)

标签: sql oracle join


【解决方案1】:

如果你需要两个名字,那么你需要加入表两次:

SELECT
    WS."ID worksite",
    C."Full name" AS CompanyName,
    A."Full name" AS AuthorityName
FROM
    Worksite AS WS
LEFT OUTER JOIN Names C ON C.ID = WS.CompanyID
LEFT OUTER JOIN Names A ON A.ID = WS.AuthorityID

我使用了LEFT OUTER JOIN,因为您没有提及是否始终填写 ID。如果他们会一直在那里,那么您可以使用INNER JOIN。我也对名为“名称”的表非常警惕。对于设计不佳的数据库,这通常是一个危险信号。

【讨论】:

  • 谢谢,我会试试看它是否有效。 ID 总是填满的,所以我会尝试内部连接。我猜你添加的字母 C 和 A 可以是随机的(在这种情况下,我猜你选择 C ​​代表公司,A 代表权威?
  • 是的,这些是表别名。它们可用于区分查询中同一个表的多个实例,也可用于使代码更清晰或更易于编写/阅读。
  • 感谢您的帮助,但它似乎不起作用。日志说它无法识别我添加的字母。知道我哪里出错了吗?我正在使用 Oracle 数据库
  • @Tom H:不,不幸的是,他们甚至在 Oracle 中被禁止
  • @philippe:Oracle 通常会告诉您哪个标识符无效,例如ORA-00904: C."Full name": invalid identifier。因此,请查看表 Names(您在此处称为 C)并检查是否有名为 Full Name 的列。正如 Alex Poole 已经指出的那样,在列名中使用空格是一个坏主意,因此您需要为列加上引号,然后大写/小写必须与列定义匹配。请改用简单的名称,例如 full_name。那么你就不必使用引号,也不必关心大小写。
猜你喜欢
  • 1970-01-01
  • 2018-05-11
  • 2014-10-05
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多