Можно ли составить отчет по 2 таблицам без использования подзапроса? - PullRequest
0 голосов
/ 29 января 2009

У вас есть одна таблица, по которой вы хотите посчитать количество предметов в двух разных таблицах. В этом примере я использовал здания, мужчины и женщины

DROP TABLE IF EXISTS building;
DROP TABLE IF EXISTS men;
DROP TABLE IF EXISTS women;
CREATE TABLE building(name VARCHAR(255));
CREATE TABLE men(building VARCHAR(255), name VARCHAR(255));
CREATE TABLE women(building VARCHAR(255), name VARCHAR(255));
INSERT INTO building VALUES('building1');
INSERT INTO building VALUES('building2');
INSERT INTO building VALUES('building3');
INSERT INTO men VALUES('building1', 'andy');
INSERT INTO men VALUES('building1', 'barry');
INSERT INTO men VALUES('building2', 'calvin');
INSERT INTO men VALUES(null, 'dwain');
INSERT INTO women VALUES('building1', 'alice');
INSERT INTO women VALUES('building1', 'betty');
INSERT INTO women VALUES(null, 'casandra');

select 
   r1.building_name, 
   r1.men,
   GROUP_CONCAT(women.name) as women,
   COUNT(women.name) +  r1.men_count as count
from 
   (select 
      building.name as building_name,
      GROUP_CONCAT(men.name) as men,
      COUNT(men.name) as men_count 
   from 
      building 
   left join 
      men on building.name=men.building
   GROUP BY building.name) as r1
left join 
   women on r1.building_name=women.building 
GROUP BY r1.building_name;

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

Ответы [ 2 ]

1 голос
/ 29 января 2009

Используйте Union для объединения данных из таблиц мужчин / женщин

select building, [name] as menname, null as womenname from men
union
select building, null as menname, [name] as womenname from women

теперь у вас есть отдельная таблица в подзапросе, к которой вы можете присоединиться, сосчитать или что-то еще.

Кстати, я понимаю, почему Кас [и] Андра гуляет на морозе, поскольку никто не верит ей, но как насчет Дуэйна, он так же проклят богами?

1 голос
/ 29 января 2009

В SQL Server я бы просто присоединился к двум подзапросам с двумя левыми соединениями - если симметрия - это то, что вы ищете:

SELECT *
FROM building
LEFT JOIN (SELECT building, etc. FROM men GROUP BY etc.) AS men_summary
    ON building.name = men_summary.building_name
LEFT JOIN (SELECT building, etc. FROM women GROUP BY etc.) AS women_summary
    ON building.name = women_summary.building_name

Я склонен использовать общие табличные выражения, объявленные первыми, вместо подзапросов - они гораздо более читабельны (но не ANSI - но тогда и не GROUP_CONCAT).

...