左外连接oracle中的三个表
问题描述:
我有三个表像图所示:左外连接oracle中的三个表
,我试图让输出象下面这样:
这里是我的已尝试到现在为止
SELECT table1.tb1_a,
CASE WHEN table3.tb3_a IS NOT NULL THEN
tb3_b
ELSE 'No city for him yet'
END AS 'City'
FROM table1
LEFT OUTER JOIN table2 ON
table1.tb1_a = table2.tb2_a
LEFT OUTER JOIN table3 ON
table2.tb2_a = table3.tb3_a
WHERE table3.tb3_a IN
(
)
现在我挣扎如何选择tb3_a列的最大值
答
这应该做你需要的东西:
SELECT t1.tb1_a, COALESCE(t3.tb3_a, 'No city for him yet') AS City
FROM table1 t1
LEFT JOIN (
SELECT MAX(tb2_b) AS tb2_b, tb2_a
FROM table2
GROUP BY tb2_a
) t2 ON (t2.tb2_a = t1.tb1_a)
LEFT JOIN table3 t3 ON (t3.tb3_a = t3.tb2_b);
的关键点是在线视图在中间,我们创造了一种虚拟表,其中包含每个tb2_a
的最大值tb2_b
值。然后,我们可以加入到此以达到预期的效果。
答
像这样的东西应该工作
select tb1_a, nvl(max(city), 'no city for him yet') thecity
from etc
group by tbl_a
答
我想你想与分析功能来做到这一点。这里是如何:
SELECT tb1_a, coalesce(tb3_b, 'No city for him yet') as City
from (select table1.tb1_a, tb3_b,
ROW_NUMBER() over (partition by table1.tbl1_a order by tb3_a desc) as seqnum
FROM table1 LEFT OUTER JOIN
table2
ON table1.tb1_a = table2.tb2_a LEFT OUTER JOIN
table3
ON table2.tb2_a = table3.tb3_a
) t
where seqnum = 1
这使用row_number()
,以确定在表3中的最后一项。这是由where seqnum = 1
条款选择的。
+0
谢谢这有助于 – javanoob 2013-02-21 22:02:14
答
试试这个,希望大家帮
with table_1 as
(select 10 as tb1_a, 'John' as tb1_b
from dual
union all
select 20 as tb1_a, 'John1' as tb1_b
from dual
union all
select 30 as tb1_a, 'John2' as tb1_b from dual),
table_2 as
(select 10 as tb2_a, 100 as tb2_b
from dual
union all
select 10 as tb2_a, 1000 as tb2_b
from dual
union all
select 10 as tb2_a, 10000 as tb2_b
from dual
union all
select 20 as tb2_a, 200 as tb2_b
from dual
union all
select 20 as tb2_a, 2000 as tb2_b
from dual
union all
select 20 as tb2_a, 20000 as tb2_b from dual),
table_3 as
(select 100 as tb3_a, 'City1' as tb3_b
from dual
union all
select 1000 as tb3_a, 'City10' as tb3_b
from dual
union all
select 10000 as tb3_a, 'City100' as tb3_b
from dual
union all
select 200 as tb3_a, 'City2' as tb3_b
from dual
union all
select 2000 as tb3_a, 'City20' as tb3_b
from dual
union all
select 20000 as tb3_a, 'City200' as tb3_b from dual)
select user_id, city
from (select u.tb1_a as user_id,
nvl(c.tb3_b, 'No city') as city,
rank() over(partition by u.tb1_a order by tb3_a) as city_rank
from table_1 u, table_2 u_c, table_3 c
where u.tb1_a = u_c.tb2_a(+)
and u_c.tb2_b = c.tb3_a(+)) t1
where city_rank = 1
答
这个工作:
http://sqlfiddle.com/#!4/7ba1c/12
SELECT table1.tb1_a,
CASE WHEN table3.tb3_a IS NOT NULL THEN tb3_b
ELSE 'No city for him yet'
END AS City,
table2.*, table3.*
FROM table1
LEFT OUTER JOIN table2 ON table1.tb1_a = table2.tb2_a
LEFT OUTER JOIN table3 ON table2.tb2_b = table3.tb3_a
where tb2_b = (select max(tb2_b)
from table2 t22
where t22.tb2_a = tb1_a)
or tb2_b is null
order by 1
我认为在where子句解释本身
我觉得在这里可以迷惑人的是,我觉得你真的想'tb2_b'的最大值然后将它加入'tb3_a'。 – ninesided 2013-02-21 17:32:19
我认为你目前的尝试存在一个错误。你比较tb2_a和tb3_a。看起来你应该比较tb2_b和tb3_a。 – 2013-02-21 17:39:46
@Walter - 你是对的看到我的例子下面 – ninesided 2013-02-21 19:59:47