【问题标题】:Is it possible to report on 2 tables without using a subquery?是否可以在不使用子查询的情况下报告 2 个表?
【发布时间】:2009-01-29 00:31:40
【问题描述】:

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

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;

还有其他方法吗?上述做法的问题是子查询中两个表的列是隐藏的,需要在外查询中重新声明。在两个单独的集合操作中执行此操作会产生不对称的情况。我们同样可以先加入女性,然后加入男性。

【问题讨论】:

    标签: sql reporting set


    【解决方案1】:

    在 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 也不是)。

    【讨论】:

    • 谢谢 - 可能是我想要的,尚未决定。哦,GROUP_CONCAT 只是示例的一个方便的聚合函数。
    【解决方案2】:

    使用 Union 合并 men/women 表中的数据

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

    您现在在子查询中添加了一个“表”,您可以加入、计数或其他任何操作。

    顺便说一句,我明白为什么 Cas[s]andra 被冷落了,没人相信她,但是 dwain 呢,他是不是同样被众神诅咒了?

    【讨论】:

    • 呃,也许……如果必须有参考的话,我想这将是红矮星。
    猜你喜欢
    • 2015-06-23
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多