在oracle的一个查询中连接内连接和外连接

时间:2014-11-07 08:01:42

标签: sql oracle oracle10g inner-join outer-join

我正在尝试在选择查询中连接7个表,其中4个是内连接,2个是外连接。

我可以在同一个查询中组合外部和内部联接吗?因为当我这样做时,我没有得到正确的结果。我尝试了两个ANSI连接(INNER JOIN,LEFT OUTER JOIN)和+符号。我想知道加入的顺序在ANSI连接中是否重要?

所以这是场景,

表p 表b 表c 表e 表f 坦勒克 表h

内连接(a,b,c)

内连接(a,e,f)

左外外连接(f,g)

左外连接(f,h)

我的查询(看起来不对)_ ==>

FROM a inner join   b on (a.col_1 = b.col_1)
  inner join  c on (b.y = c.y)
  inner join  e on ( a.col_1      = e.col_1)
  inner join   f on (e.col_4   = f.col_4)
  left outer join  g on (g.col_5= f.col_5)
  left outer join  h on (h.col_6 = f.col_6)

任何人都可以帮我正确加入查询吗? 任何领导都将受到高度赞赏

2 个答案:

答案 0 :(得分:2)

您始终可以与INNEROUTER JOIN一起撰写查询。

您的示例不明确,因为当您编写查询时非常重要,知道您的目标。

INNER JOIN:如果要跨两个(或更多)表提取行,则使用此操作,并且在两个表中都存在这些数据值非常重要。

OUTER JOIN:如果要在链接表中显示相应的行,则要从主表中独立提取行时使用此操作。

我试着举个例子:

我有一张桌子(PERSON),里面有人员名单。此表有一个外键,用于指向表(COUNTRY)以了解有关出生地的信息。我有另一张桌子(BANK_ACCOUNT),我在那里存储每个人的银行账户(如果有人)。

我的结果想知道:所有人信息(包括出生地名称)以及一个人是否有银行账户,都知道。

查询:

SELECT p.*, b.name, b.account_no
FROM person p
INNER JOIN country c <-- Here I apply an INNER JOIN
    ON p.fk_country = c.id
LEFT OUTER JOIN bank_account b <-- Here I apply an OUTER JOIN
    ON b.fk_person = p.id 

在这种情况下了解目标非常重要!关于另一个目标,上层查询可能是错误的。

关于JOIN的顺序:顺序不重要,但是类型是。

INNER JOIN:是可交换的。如果你有表A和表B,如果你写

A INNER JOIN B is the same if you write B INNER JOIN A

OUTER JOIN:不可交换。如果您有表A和表B,则以下查询是差异:

A LEFT OUTER JOIN B

B LEFT OUTER JOIN A

因为第一个告诉:获取所有A行,如果B中存在相应的行,则给我这些信息,而不是返回NULL值。

第二个查询告诉:获取所有B行,如果A中存在相应的行,则给我这些信息,而不是返回NULL值。

答案 1 :(得分:0)

你的一些INNER JOIN(=“要求”)可能没有返回任何东西。

如果无法填充“join on -condition”,则内部联接不会从源表(a)返回任何内容。左连接返回行(来自表a)并使用空值填充连接行的列(如果未找到)。在这两种情况下,如果有多个匹配项,则还会返回多行。

每个表中有一行的示例:

  • 表A值(col_1,...,col_4)=(1,2,3,4)
  • 表b值(col_1,x,y,z)=(1,3,5,7)
  • 表c值(col_1,x,y,z)=(1,3,5,7)
  • 表e值(col_1,...,col_4)=(1,...,6)
  • 表格f值(col_1,...,col_6)=(8,...,7,4,3)
  • 表g值(col_1,...,col_6)=(7,...,4,6)
  • 表h值(col_1,...,col_6)=(...,9)

我们的查询:

FROM a 
inner join b on (a.col_1 = b.col_1)       -- requirement 1
inner join c on (b.y = c.y)              -- requirement 2
inner join e on ( a.col_1 = e.col_1)     -- requirement 3
inner join f on (e.col_4 = f.col_4)     -- requirement 4
left outer join g on (g.col_5= f.col_5)  -- optional 1
left outer join h on (h.col_6 = f.col_6) -- optional 2

我们还要退货吗?

  • 要求1:a.col_1 = b.col_1; 1 = 1 - &gt;行
  • 要求2:b.y = c.y; 5 = 5 - >行
  • 要求3:a.col_1 = e.col_1; 1 = 1 - &gt;行
  • 要求4:e.col_4 = f.col_4; 6!= 7 - &gt;不行。

此时查询将不会返回任何内容,我们也不需要检查左连接(没有任何内容可以加入)。

如果f.col4为6而不是7,则返回示例行。然后,如果条件可以匹配,我们也将从g加入行(g.col_5 = f.col_5; 4 = 4 - > OK)。在此示例中,表h中的选定列将全部具有值null,因为不满足条件(可选2)。

我希望这可以帮助您找到问题。没有有效数据,很难看到实际问题。将来,请考虑使用SQL Fiddle作为问题。

PS。 OUTER和INNER是可选单词,在查询中没有任何区别。所以 LEFT OUTER JOIN LEFT JOIN 相同, INNER JOIN JOIN相同。 < / p>