0

私の例は少しばかげていますが、私の頭に浮かんだ最高のものです;)

Zoo
===
Id
Name

Animal
=======
Id
Species
ZooId

Zookeeper
=========
Id
FullName
ZooId

そこに次の行があります:

Zoo
===
1, New York
2, Berlin

Animal
======
1, Tiger, 1
2, Monkey, 1
3, Bear, 1
4, Tiger, 2
5, Zebra, 2

Zookeeper
=========
1, John Doe, 1
2, Peter Smith, 2
3, Ronald Jackson, 2
4, Michael Miller, 2

私の予想される出力は次のようになります。

New York, 3, 1
Berlin, 2, 3

次のクエリを試しましたが、ナンセンスです。

SELECT Zoo.Name, COUNT(Animal.Id) AS Animals, COUNT(Zookeeper.Id) AS Zookeepers
FROM Zoo
LEFT JOIN Animal ON Animal.ZooId = Zoo.Id
LEFT JOIN Zookeper ON Zookeeper.ZooId = Zoo.Id
GROUP BY Zoo.Name

両方の列で同じ数を取得しましたが、小さなデータセットでも数分かかります。

4

2 に答える 2

1

試す

SELECT z.Name, 
       COALESCE(a.Animals, 0) Animals, 
       COALESCE(k.Zookeepers, 0) Zookeepers
  FROM Zoo z LEFT JOIN 
( 
  SELECT zooid, COUNT(*) Animals
    FROM animal
  GROUP BY zooid
) a ON z.id = a.zooid LEFT JOIN 
( 
  SELECT zooid, COUNT(*) Zookeepers
    FROM zookeeper
  GROUP BY zooid
) k ON z.id = k.zooid

出力:

|      NAME | ANIMALS | ZOOKEEPERS |
------------------------------------
|  New York |       3 |          1 |
|    Berlin |       2 |          3 |

ここにSQLFiddleがあります

于 2013-06-07T10:08:19.550 に答える
1

これを試して、

select  t1.nm,t2.Animal_count,t3.Zookeeper_count
FROM Table1 t1
INNER JOIN 
(select t22,count(Animal) AS Animal_count from Table2 group by(t22)) t2
ON t1.id=t2.t22
INNER JOIN 
(select t32,count(name) As Zookeeper_count from Table3 group by(t32)) t3
ON t1.id=t3.t32

SQLFiddle デモ

于 2013-06-07T10:27:30.350 に答える