Как делают я комбинирую эти два избранных оператора в один запрос:
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
Спасибо за помощь в выяснении этого вопроса. Привет Дэвиду Холлу, Аарону, Джеффри Уитледж и 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
В приведенном вами примере показано, что вы хотите объединить запросы по горизонтали, но позже вы заявили, что они полностью независимы. Это противоречивые утверждения, потому что вы обычно комбинируете данные по горизонтали, когда записи связаны друг с другом. Ниже представлена моя идея комбинировать их по горизонтали, но я также отмечаю свою идею комбинирования их по вертикали ниже этого.
Это зависит от того, как вы хотите их связать. Если вы запрашиваете на основе соседства, вы можете выполнить соединение между двумя более крупными запросами на 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 запрос). Затем просто СОЕДИНИТЕ два больших запроса вместе. Это позволит объединить их вертикально, а не горизонтально.
Отображение двух несвязанных запросов рядом друг с другом обычно является задачей программного обеспечения для создания отчетов, а не SQL-движка. Проблема здесь в том, что вы просите инструмент запросов сделать то, для чего он не приспособлен: отобразить форматирование.
Отношение (а именно таким должен быть результат SELECT, по сути) - это структура данных, которая делает утверждения о состоянии мира. Каждая строка определяет ряд утверждений, которые (в идеале) являются истинными.
В вашем вопросе строки содержат произвольные комбинации фактов, которые не связаны друг с другом и о которых нельзя утверждать никаких предложений.
Если я правильно понимаю, что вам нужно, вы можете ОБЪЕДИНЯТЬ запросы вместе, добавив столбец, чтобы вы знали, из какого запроса он пришел:
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
Допустим, у вас будет вдвое больше строк, и половина ваших данных будет нулевой , но просто "захлопывать" результаты вместе, как в вашем примере, не является обычным явлением.
Ответы других на использование столбца дискриминатора выглядят так же, как и вам, но на всякий случай можно добавить столбцы фиктивных заполнителей в профсоюзы, как показано ниже:
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