Sql 根据空ID从3连接2个表

Sql 根据空ID从3连接2个表,sql,oracle,join,Sql,Oracle,Join,我有三张桌子: CREATE TABLE B ( id INTEGER PRIMARY KEY, personName VARCHAR2(200) ); CREATE TABLE C ( id INTEGER PRIMARY KEY, companyName VARCHAR2(200) ); CREATE TABLE A ( id INTEGER PRIMARY KEY, id_b INTEGER REFERENCES B(id)

我有三张桌子:

CREATE TABLE B (
  id         INTEGER PRIMARY KEY,
  personName VARCHAR2(200)
);

CREATE TABLE C (
  id          INTEGER PRIMARY KEY,
  companyName VARCHAR2(200)
);

CREATE TABLE A (
  id   INTEGER PRIMARY KEY,
  id_b INTEGER REFERENCES B(id),
  id_c INTEGER REFERENCES C(id),
  CHECK ( id_b IS NULL OR id_c IS NULL )
);
但表A一次只指向一个表:如果idB有值,则idC为空

我现在尝试执行一个查询,在其中选择所有行和每一行:要么是个人行(id,id\u B,personName),要么是公司行(id,id\u B,companyName)

有没有不使用存储过程的方法可以做到这一点?

试试以下方法:

select id,id_b,personName from A join B on A.id_b = B.id
union all
select id,id_c,companyName from A join C on A.id_c = C.id

也许你应该考虑改变你的检查约束,比如<代码> NVL2(IDAB,1, 0)+NVL2(IDARC,1, 0)= 1 < /代码> /P>添加一些示例表数据和预期结果。作为格式化文本,而不是图像。为什么传统的oracle逗号连接而不是ANSI标准连接?它们更短,当ANSI连接有时被报告为“发现了另一个实现错误”时,更容易阅读且工作无误。它们不容易阅读-连接条件与过滤条件混合在一起,并不总是明显的,您无法进行
完全外部连接
s,并且很容易获得
(+)
在错误的一侧。ANSI连接更容易阅读。很难客观地质疑可读性。我想说,写得好的旧式语句比写得好的ANSI式语句容易,而写得不好的两者都很难。但有关ansi连接的错误报告很容易触及我们这个世界的事实,所以我宁愿只在必要时才使用它们。周六花10个小时调试神秘错误,然后阅读关于“这只是连接错误”的Metalink说明,这是非常令人伤心的。我们很抱歉。
select
  a.id,
  coalesce(b.id, c.id),
  coalesce(b.person_name, c.company_name)
from
  A a,
  B b,
  C c
where
  a.id_b = b.id (+) and
  a.id_c = c.id (+)