Как объединить эти запросы SQL SELECT в один оператор SELECT - PullRequest
8 голосов
/ 03 марта 2010

Как мне объединить эти два оператора выбора в один запрос:

SELECT SUM( incidents )  AS fires, neighborhoods AS fire_neighborhoods
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location`
UNION ALL SELECT * 
FROM `fires_2007_incident_location`
UNION ALL SELECT * 
FROM `fires_2006_incident_location`
) AS combo
GROUP BY fire_neighborhoods ORDER BY fires DESC



SELECT SUM( incidents )  AS adw, neighborhoods AS adw_neighborhoods
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo2
GROUP BY adw_neighborhoods ORDER BY adw DESC

Итак, я бы хотел, чтобы запрос возвращался, что-то вроде:

fire_neighborhoods  fires  adw_neighborhoods  adw
xyzNeighborhood     6      abcNeighborhood    22
jklNeighborhood     3      tuvNeighborhood    40

Я хочу просто объединить результаты двух запросов выше. Два запроса не зависят друг от друга. Результаты одного не влияют на результаты другого запроса. Мне просто нужен способ объединить два результата в один.

Если у кого-нибудь есть совет, пожалуйста, дайте мне знать.

Спасибо.

-Laxmidi

Ответы [ 5 ]

3 голосов
/ 03 марта 2010

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

Зависит от того, как вы хотите связать их.Если вы делаете запросы на основе соседства, вы можете объединить два больших запроса в fire_neighborhoods = adw_neighborhoods, например:

SELECT fire_neighborhoods, fires, adw
FROM (

SELECT SUM( incidents )  AS fires, neighborhoods AS fire_neighborhoods
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location`
UNION ALL SELECT * 
FROM `fires_2007_incident_location`
UNION ALL SELECT * 
FROM `fires_2006_incident_location`
) AS combo
GROUP BY fire_neighborhoods ORDER BY fires DESC

) AS fires
    INNER JOIN (  

SELECT SUM( incidents )  AS adw, neighborhoods AS adw_neighborhoods
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo2
GROUP BY adw_neighborhoods ORDER BY adw DESC

) AS adw
    ON fires.fire_neighborhoods = adw.adw_neighborhoods

Это только пример.Вам может понадобиться другое соединение или что-то еще, чтобы это сработало для вас.

Теперь вы заявили, что два запроса независимы и не влияют друг на друга.Если они действительно не имеют общего основания, вы должны добавить столбец к каждому запросу, указывающий запрос, из которого он получен (например, добавить столбец с постоянным значением 1 для запроса на запуск и столбец с постоянным значением 2 для adwзапрос).Затем просто объедините два больших запроса вместе.Это объединит их в вертикальной манере, а не в горизонтальной.

2 голосов
/ 03 марта 2010

Если я правильно понимаю, что вам нужно, вы можете объединить запросы вместе, добавив столбец, чтобы узнать, из какого запроса он поступил:

SELECT SUM( incidents )  AS fires_or_adw, neighborhoods AS fire_or_adw_neighborhoods, 'Fires' as which_query
FROM (
SELECT * 
FROM `fires_2009_incident_location` 
UNION ALL SELECT * 
FROM `fires_2008_incident_location`
UNION ALL SELECT * 
FROM `fires_2007_incident_location`
UNION ALL SELECT * 
FROM `fires_2006_incident_location`
) AS combo
GROUP BY fire_neighborhoods ORDER BY fires DESC

UNION

SELECT SUM( incidents )  AS fires_or_adw, neighborhoods AS fire_or_adw_neighborhoods, 'ADW' as which_query
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo2
GROUP BY adw_neighborhoods ORDER BY adw DESC

Конечно, у вас будет в два раза больше строк, а половина ваших данных будет нулевой, но просто "отбросить" результаты вместе, как в вашем примере, не обычно.

1 голос
/ 04 марта 2010

Спасибо за помощь в выяснении этого.Приветствую Дэвида Холла, Аарона, Джеффри Уитледжа и NYSystemsAnalyst.Я выбрал фиктивную колонку:

SELECT SUM( incidents ) , neighborhoods,  'adw' as offense 
FROM (
SELECT * 
FROM `adw_2009_incident_location` 
UNION ALL SELECT * 
FROM `adw_2008_incident_location`
UNION ALL SELECT * 
FROM `adw_2007_incident_location`
UNION ALL SELECT * 
FROM `adw_2006_incident_location`
) AS combo 
GROUP BY neighborhoods  
UNION ALL
SELECT SUM( incidents ), neighborhoods,  'fire' as offense 
FROM (
SELECT * 
FROM `fire_2009_incident_location` 
UNION ALL SELECT * 
FROM `fire_2008_incident_location`
UNION ALL SELECT * 
FROM `fire_2007_incident_location`
UNION ALL SELECT * 
FROM `fire_2006_incident_location`
) AS combo2
GROUP BY neighborhoods 
1 голос
/ 04 марта 2010

Ответы других участников на использование столбца дискриминатора выглядят так, как вы хотите, но на всякий случай можно добавить столбцы фиктивных заполнителей в объединения, как показано ниже:

SELECT 
    SUM( incidents )  AS fires, 
    neighborhoods AS fire_neighborhoods,
    0 as adw,
    '' as adw_neighbourhoods
FROM ( 
    SELECT *  
    FROM `fires_2009_incident_location`  
    UNION ALL SELECT *  
    FROM `fires_2008_incident_location` 
    UNION ALL SELECT *  
    FROM `fires_2007_incident_location` 
    UNION ALL SELECT *  
    FROM `fires_2006_incident_location` 
) AS combo 
GROUP BY fire_neighborhoods ORDER BY fires DESC 

UNION 

SELECT 
    0 as fires,
   '' as fire_neighbourhoods,
    SUM( incidents )  AS adw, 
    neighborhoods AS adw_neighborhoods 
FROM ( 
    SELECT *  
    FROM `adw_2009_incident_location`  
    UNION ALL SELECT *  
    FROM `adw_2008_incident_location` 
    UNION ALL SELECT *  
    FROM `adw_2007_incident_location` 
    UNION ALL SELECT *  
    FROM `adw_2006_incident_location` 
) AS combo2 
GROUP BY adw_neighborhoods ORDER BY adw DESC
0 голосов
/ 04 марта 2010

Отображение двух взаимосвязанных запросов обычно является задачей программного обеспечения для составления отчетов, а не механизма SQL. Проблема в том, что вы запрашиваете у инструмента запросов что-то, что ему не подходит: отображать форматирование.

Отношение (которое, по сути, является результатом SELECT) является структурой данных, которая делает утверждения о состоянии мира. Каждый ряд определяет ряд предложений, которые (в идеале) верны.

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

...