首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在不使用子查询的情况下报告2个表?

是否可以在不使用子查询的情况下报告2个表?
EN

Stack Overflow用户
提问于 2009-01-29 00:31:40
回答 2查看 258关注 0票数 0

您有一个表,您希望根据该表计算两个不同表中的项目数。在这个例子中,我使用了建筑物,男人和女人

代码语言:javascript
复制
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;

有没有别的办法?上述方法的问题在于,子查询中两个表的列是隐藏的,需要在外部查询中重新声明。在两个单独的集合操作中创建不对称,而不存在不对称。我们同样可以先加入女性,然后加入男性。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-29 00:40:27

在SQL Server中,我只需要使用两个左连接来连接两个子查询-如果您想要的是对称性:

代码语言:javascript
复制
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也不是)。

票数 1
EN

Stack Overflow用户

发布于 2009-01-29 01:05:17

使用Union合并来自男性/女性表的数据

代码语言:javascript
复制
select building, [name] as menname, null as womenname from men
union
select building, null as menname, [name] as womenname from women

现在,您在子查询中添加了一个‘表’,您可以对其进行连接、计数或其他操作。

顺便说一句,我明白为什么卡珊德拉被冷落了,因为没有人相信她,但是德文呢,他也同样被众神诅咒了吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/490053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档