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

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

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

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

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

Спасибо.

-Лакшмиди


person Laxmidi    schedule 03.03.2010    source источник
comment
Я должен что-то упустить. Почему вы не можете просто ОБЪЕДИНИТЬ два запроса вместе?   -  person Jim G.    schedule 03.03.2010
comment
Можете ли вы опубликовать структуру ваших таблиц?   -  person shoover    schedule 03.03.2010
comment
И почему люди голосуют за этот вопрос? Этот вопрос действительно полезен? Мне это кажется довольно академическим и излишним.   -  person Jim G.    schedule 03.03.2010
comment
@ Джим Г.: Значок «Во всем виноват избиратель»: stackoverflow.com/badges/155/electorate   -  person OMG Ponies    schedule 03.03.2010
comment
Почему схема сопоставляет одну таблицу в год? Это взгляды?   -  person Jim G.    schedule 03.03.2010
comment
Привет, Джим. По сути, это просмотры. Короче говоря, есть код, который определяет, происходит ли инцидент внутри района. Он работает слишком медленно. Итак, я запустил его до того, как пользователь запросил его, и бросил его в эти таблицы. Это не здорово, но это работает. Я все еще учусь. Спасибо. -Лакшмиди   -  person Laxmidi    schedule 04.03.2010


Ответы (5)


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

Это зависит от того, как вы хотите связать их. Если вы выполняете запрос на основе соседства, вы можете выполнить соединение между двумя более крупными запросами на 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). запрос). Затем просто ОБЪЕДИНИТЕ два больших запроса вместе. Это объединит их по вертикали, а не по горизонтали.

person DCNYAM    schedule 03.03.2010
comment
Привет, NYSystemsAnalyst! Спасибо за предложение добавить столбцы с константами. Я, вероятно, в конечном итоге сделать это. -Лакшмиди - person Laxmidi; 04.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

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

person Aaron    schedule 03.03.2010
comment
Привет, Аарон, я думаю, мне не нужно возвращать данные по горизонтали. Я мог бы добавить столбец, который будет указывать, является ли это пожаром или рекламой, а затем сделать другие столбцы соседями и инцидентами. -Лакшмиди - person Laxmidi; 04.03.2010
comment
Привет Аарон, я забыл сказать спасибо в моем предыдущем сообщении. Извиняюсь. -Лакшмиди - person Laxmidi; 04.03.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
person David Hall    schedule 03.03.2010
comment
Привет Дэвид, Спасибо за сообщение. Я попробовал ваше предложение и, к сожалению, не смог заставить его работать. Можно ли добавить фиктивные столбцы в MySQL? -Лакшмиди - person Laxmidi; 04.03.2010
comment
@Laxmidi - вы видите ошибку при запуске этого синтаксиса? Я не уверен в mySQL, хотя я ожидаю, что он должен работать. Кто-то пометил вопрос тура как tsql, который является реализацией Microsoft sql, я собираюсь изменить его сейчас. - person David Hall; 04.03.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 
person Laxmidi    schedule 04.03.2010

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

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

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

person Jeffrey L Whitledge    schedule 03.03.2010
comment
Привет Джеффри, ты прав. Нет смысла возвращать данные по горизонтали. Спасибо - Лакшмиди - person Laxmidi; 04.03.2010