2016-05-29 6 views
1

Я хочу, чтобы сделать вычитание так:Postgres - Вычитание двух запросов

SELECT 
    (SELECT ST_Y(ST_Centroid(ST_Collect(column1))) AS distance_km 
    FROM table1) - 
    (SELECT ST_Y(ST_Transform(column1,4326)) AS distance_km 
    FROM table1) AS Difference 

Но ST_Y(ST_Centroid(ST_Collect(column1))) имеет только одну строку и ST_Y(ST_Transform(column1,4326)) имеет несколько строк. Я хочу вычесть несколько строк по столбцу и посмотреть результаты для каждой из нескольких строк. По этому запросу я получаю:

ERROR: more than one row returned by a subquery used as an expression

Любая помощь?

+0

Просьба указать примерный случай. Вы предполагаете, что если у вас есть '10' от первого запроса и' {1,2,5,7} 'от второго запроса, вам нужны результаты' {9,8,5,3} '? – MatBailie

+0

То же самое с 'SELECT (SELECT 1 UNION SELECT 2);'. Вы просто не можете сделать это с помощью SQL! –

+0

@MikeT - «Вы» не можете использовать синтаксис, используемый Op, правильно. Но, в зависимости от фактического *** функционального *** требования, SQL, скорее всего, * * может полностью заполнить его, с правильным синтаксисом. – MatBailie

ответ

2

Следующий запрос присоединяется к набору результатов с одной строкой против множества результатов набора строк и позволяет сравнивать их.

SELECT 
    a.*, 
    b.*, 
    a.distance_km - b.distance_kn AS difference 
FROM 
(
    SELECT ST_Y(ST_Centroid(ST_Collect(column1))) AS distance_km FROM table1 
) 
    a 
CROSS JOIN 
(
    SELECT ST_Y(ST_Transform(column1,4326)) AS distance_km FROM table1 
) 
    b 
+0

@PRVS - Подзапросы и 'CROSS JOIN' являются ANSI-SQL. Итак, да, он работает в PostGreSQL. – MatBailie

+0

Это работает! Спасибо огромное! – PRVS

+0

@MatBailie: имя либо написано PostgreSQL, либо просто Postgres. Никогда с капиталом G –

Смежные вопросы