sql - 从两个子查询中选择,在另一列上加入

标签 sql postgresql

我从三个表中提取了两个查询:

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/

相关文章:

php - SQL 计算个人最佳表中所有时间记录中保存的记录

mysql - SQL 表中的 Tkinter 下拉菜单

sql - 如何使用单个查询将多个对象表中的记录连接到主表?

django - 无法迁移,django.db.migrations.exceptions.MigrationSchemaMissing

php - 如何访问 mysqli_query 的数组值

sql - 尝试使用 Delphi FireDac 连接到 Windows Azure SQL 数据库时出现错误 "no such table CUSTOMERS"

ruby-on-rails - 如何(通过关系表)加入针对自身的表?

java - postgres服务器拒绝连接到heroku

python - Django + PostgreSQL - 1000 次插入/秒,如何加速?

validation - to_tsquery() 验证