我从三个表中提取了两个查询:
t1 -sites
t2 - blues
t3 - reds
查询1 -
SELECT s.site_name b.year b.value
FROM sites s, blues b
WHERE s.id = b.site_id AND s.site_name ='site1'
返回以下(例如)
| site_name | year | blues |
| site1 | 2012 | 23.6 |
| site1 | 2011 | 19.1 |
| site1 | 2010 | 10.2 |
| site1 | 2009 | 25.8 |
| site1 | 2008 | 14.0 |
查询 2
SELECT s.site_name r.year r.value
FROM sites s, reds r
WHERE s.id = r.site_id
AND s.site_name ='site1'
返回:
| site_name | year | reds |
| site1 | 2012 | 14.0 |
| site1 | 2010 | 11.0 |
| site1 | 2009 | 18.9 |
我最终想要这个:
| site_name | year | blues | reds |
| site1 | 2012 | 23.6 | 14.0 |
| site1 | 2011 | 19.1 | |
| site1 | 2010 | 10.2 | 11.0 |
| site1 | 2009 | 25.8 | 18.9 |
| site1 | 2008 | 14.0 | |
这基本上相当于一个网站的蓝色和红色表中的所有记录,即使其中一个表没有当年的记录,也会匹配年份。
非常感谢@vkp 为我指明了正确的方向:CTE 来拯救。
这是经过测试的查询
WITH x AS (SELECT s.site_name AS name, b.year AS yr1, b.value AS blue_val
FROM public.sites s JOIN public.blues b
ON s.id = b.site_id
WHERE s.site_name = 'Site1'
), y AS (SELECT s.site_name, r.year AS yr2, r.value AS red_val
FROM public.stations s JOIN public.reds r
ON s.id = r.site_id
WHERE s.site_name = 'Site1'
)
SELECT x.name, x.yr1, x.blue_val, y.red_val
FROM x LEFT JOIN y ON x.yr1 = y.yr2
最佳答案
SELECT s.site_name, b.year, b.value as blues, r.value as reds
FROM sites s right join blues b on s.id = b.site_id
right join reds r on s.id = r.site_id and b.year = r.year
where s.site_name ='site1'
使用 CTE 更新查询:
with x as (SELECT s.site_name, b.year, b.value as blues
FROM sites s join blues b on s.id = b.site_id
where s.site_name ='site1')
, y as (SELECT s.site_name, r.year, r.value as blues
FROM sites s join reds r on s.id = r.site_id
where s.site_name ='site1')
,yrs as (select year from x union select year from y)
select
case when x.site_name is not null then x.site_name
else y.site_name end as site_name
, yrs.year, x.value as blue_val, y.value as red_val
from yrs left join x on x.year = yrs.year
left join y on y.year = yrs.year
关于sql - 从两个子查询中选择,在另一列上加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31525058/