2015-08-17 4 views
0

Мне нужна помощь по sql-соединениям. У меня есть 3 выберите заявления, которые дают мне такой вывод:SQL-соединение в разных подсчетах результатов подсчета

select-statement A: 
location amount_A 
7234  17 
7456  2 

select-statement B: 
location number_x 
7234  4455 
7456  555 

select-statement C: 
location errors 
7234  1 
7456  44537 

Я хочу, чтобы иметь результат в одной таблице, как это:

location Amount_A number_x errors 
7234  17  4455  1 
7456  2   555  44537 

, что это лучший и/или самый простой способ для достижения этой цели? Каждый select-statement использует другие таблицы.?!

эти заявления:

A: select substring(column_a for 4) location, count(*) Amount_A from table_a where column_a like '7%' group by location ; 
B: select substring(e.column_xy for 4), count(*) number_x from table_b b, table_e e , table_c c where b.stationextension_id = e.id and b.id = c.id and (c.column_h in ('value_a', 'value_b')) group by substring(e.column_xy for 4) ; 
C: select substring(name from 1 for 4), count(*) from errors group by substring(name from 1 for 4) ; 
+0

спасибо за редактирование, чтобы сделать его более читаемым. – astrakid

ответ

0

Попробуйте это:

select 
    a.location, a.amount_A, 
    b.number_x, 
    c.errors 
from (
    select_satement_A 
) as a 
join (
    select_satement_B 
) as b on a.location = b.location 
join (
    select_satement_C 
) as c on a.location = c.location 

Если все данные от select_satement_A должно быть retrieved использование left join. Все данные от select_satement_A будут получены с соответствующими данными от select_satement_B и select_satement_C. Если не найдено ни одного совпадения для найденного условия joinnull.

select 
     a.location, a.amount_A, 
     b.number_x, 
     c.errors 
    from (
     select_satement_A 
    ) as a 
    left join (
     select_satement_B 
    ) as b on a.location = b.location 
    left join (
     select_satement_C 
    ) as c on a.location = c.location 

Для всех данных, которые необходимо извлечь, используйте full join.

+0

работает, но я получаю только 1 строку в моей таблице результатов - значения этой строки верны. – astrakid

+0

Если вам нужны все 'данные' для всех строк в' sele_state_A', то используйте 'left join'. Обновите ответ. – Praveen

+0

заменил соединение полным соединением, и он работает так же, как и он! большое спасибо!!! – astrakid

1

Используйте Inner Join, чтобы соединить все три запроса.

Также используйте синтаксис Inner Join для объединения двух таблиц, которые более читабельны, а затем разделяются запятыми в стиле старого стиля.

Substring функция имеет некоторые различные аргументы, надеюсь, что те являются примером в исходном запросе вам необходимо пройти соответствующие значения функции подстроки

select a.location,Amount_A ,number_x,errors from 
(
SELECT substring(column_a for 4) location, count(*) Amount_A FROM table_a WHERE column_a LIKE '7%' GROUP BY location 
) A 
inner join 
(
SELECT substring(e.column_xy for 4) location , count(*) number_x FROM table_b b inner join table_e e on b.stationextension_id = e.id and b.stationextension_id = e.id 
inner join table_c c on b.id = c.id 
where c.column_h IN ('value_a', 'value_b')) GROUP BY substring(e.column_xy FOR 4) ; 
) B on a.location = b.location 
inner join 
(
SELECT substring(name from 1 FOR 4) location, count(*) errors FROM errors GROUP BY substring(name FROM 1 FOR 4) ; 
) 
C on c.location = b.location 
+1

Используемая функция «SUBSTRING» OP выглядит так, как будто она исходит из MySQL. – TTeeple

+0

это postgresSQL – astrakid

0

Вы можете объединить все три запроса в один

SELECT s1.location, 
     s1.Amount_A, 
     s2.number_x, 
     s3.errors 
    FROM (SELECT SUBSTRING (column_a FOR 4) AS location, 
    COUNT(*) AS Amount_A 
    FROM table_a 
    WHERE column_a LIKE '7%' 
    GROUP BY location) s1 
    JOIN (SELECT SUBSTRING(e.column_xy FOR 4) AS location, 
    COUNT(*) AS number_x 
    FROM table_b b 
    JOIN table_e e ON b.stationextension_id = e.id 
    JOIN table_c c ON b.id = c.id 
    WHERE c.column_h IN ('value_a', 'value_b') 
    GROUP BY SUBSTRING(e.column_xy FOR 4)) s2 
    ON s1.location = s2.location 
    JOIN (SELECT SUBSTRING(name FROM 1 FOR 4) AS location, 
    COUNT(*) AS errors 
    FROM errors 
    GROUP BY SUBSTRING(name FROM 1 FOR 4)) s3 ON s1.location = s3.location 
0

Вы всегда можете объединить в один оператор с некоторыми левыми внешними соединениями. Полагаю, что у местоположений нет ошибок.

Без лучшего понимания базовых данных немного сложно получить соединения в правильном порядке, но я надеюсь, что это указывает на то, что вы в правильном направлении.

select substring(e.column_xy for 4) location, 
     count(a.column_xy)   Amount_A, 
     count(e.ie)     number_x, 
     count(e2.name)    errors 
    from table_b b 
    inner join table_e e on b.stationextension_id  = e.id 
    inner join table_c c on b.id       = c.id 
    left join table_a a on substring(e.column_xy for 4) = substring(a.column_a from 1 for 4) 
         and a.column_a    like '7%' 
    left join errors e2 on substring(e.column_xy for 4) = substring(e2.name from 1 for 4) 
    where c.column_h in ('value_a', 'value_b') 
    group by substring(e.column_xy for 4); 
Смежные вопросы