一个表中有3个相同的外键,select语句

时间:2016-05-17 01:16:35

标签: sql oracle

我有表错误,这个表有3个外键 - 来自同一个表的ID_empl,ID_empl1,ID_empl2 - 雇主,其中ID_empl是主键,还有其他属性Name和Surname.ID_empl参考谁修复错误,ID_empl1引用谁报告错误amd ID_empl参考谁接管错误。

现在我想在这个表上做SELECT错误,我希望有这样的语句:ID_empl - name, surname; ID_empl1 - name, surname; ID_empl2 - name, surname。如果只有1个FK让我们说ID_empl我会做SELECT er.ID_empl, em.name||em.surname as EMPLOYER from employer em, error er where er.ID_empl=em.ID_empl。但是我不知道如何用3个相同的FK来做这个,我需要每个FK 3次这个信息(名字+姓氏)。

小Q2:我有表公司有一些属性和FK ID_empl参考谁管理这家公司。此FK可以为空。现在,当我想要做的时候:select e.name||e.surname as EMPLOYER from employer e, company c where e.ID_empl=c.ID_empl我只得到ID_empl不是公牛的行,但我想要所有的行。连接有一个问题,ID_empl可以为null,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

您所描述的内容听起来像是多次加入的作业。使用您的语法(旧的,过时的,不推荐 - 甚至Oracle自己建议使用现代语法),它将是

select [whatever], emp1.name || ' ' || emp1.surname as repaired,
                   emp2.name || ' ' || emp2.surname as reported,
                   emp3.name || ' ' || emp3.surname as took_over
from errors er, employer emp1, employer emp2, employer emp3
where er.ID_empl  = emp1.ID_empl
  and er.ID_empl1 = emp2.ID_empl
  and er.ID_empl2 = emp3.ID_empl

通过这种方式修改"姓名和姓氏#34; (修复错误的人)从表格#34;雇主"对于"错误"中的id = ID_empl table(你说那是包含修复错误的人的ID的列的外键),"报告"的名称和姓氏。从雇主"中选出表中的id = ID_empl1的表"错误" (使用报告错误的人的外键)和类似的#34;接管。"

正确的,现代的SQL标准,推荐的连接语法是

..... from errors er join employer emp1 on er.ID_empl  = emp1.ID_empl
                     join employer emp2 on er.ID_empl1 = emp2.ID_empl
                     join employer emp3 on er.ID_empl2 = emp3.ID_empl

对于第二个问题,您只需要一个OUTER加入。对于这一点,也有#34;旧式"专有的Oracle语法,Oracle本身不建议使用。外连接的正确,现代的SQL标准语法是:

select [whatever], e.name || ' ' || e.surname
from company c left outer join e on c.ID_empl = e.ID_empl