我正在尝试在选择查询中连接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)
任何人都可以帮我正确加入查询吗? 任何领导都将受到高度赞赏
答案 0 :(得分:2)
您始终可以与INNER
和OUTER 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)并使用空值填充连接行的列(如果未找到)。在这两种情况下,如果有多个匹配项,则还会返回多行。
每个表中有一行的示例:
我们的查询:
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
我们还要退货吗?
此时查询将不会返回任何内容,我们也不需要检查左连接(没有任何内容可以加入)。
如果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>