2009-01-29 165 views
0

你有一張桌子,你希望計算兩個不同表格中的物品數量。在這個例子中,我用建築物,男人和女人是否可以在不使用子查詢的情況下報告2個表?

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; 

可能有另一種方式?上述方法的問題是子查詢中兩個表的列是隱藏的,需要在外部查詢中重新聲明。在兩個單獨的集合操作中執行操作會在沒有操作的情況下產生不對稱。我們同樣可以先加入女性,然後加入男性。

回答

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)。

+0

Thx - 可能是我想要的,尚未決定。哦,GROUP_CONCAT對於這個例子來說只是一個方便的聚合函數。 – 2009-01-29 01:01:27

1

使用聯盟將數據從男/女表

​​

你現在有一個「表」 addmitedly在子查詢,可以它加入,計數或任何組合。

順便說一句,我明白了爲什麼Cas的安德拉冷冷清清,因爲沒有人相信她,但是他怎麼樣,他同樣被衆神詛咒?

+0

嗯,也許......我想如果必須有一個參考,它會是紅矮星。 – 2009-01-29 01:08:37

相關問題