2

エラーが発生しました: #1242 - この SQL を実行すると、サブクエリが複数の行を返します。

CREATE VIEW test 
AS 
  SELECT cc_name, 
         COUNT() AS total, 
         (SELECT COUNT(*) 
            FROM bed 
           WHERE respatient_id > 0 
        GROUP BY cc_name) AS occupied_beds, 
         (SELECT COUNT(*) 
            FROM bed 
           WHERE respatient_id IS NULL 
        GROUP BY cc_name) AS free_beds 
    FROM bed 
GROUP BY cc_name; 
4

4 に答える 4

4

これは、サブクエリ(SELECT括弧内のビット)が外側の行ごとに複数の行を返すためです。問題はGROUP BY;にあります。これにサブクエリを使用する場合は、外部クエリと同じものを参照するように指定して、サブクエリを外部クエリに関連付けるcc_name必要があります。

CREATE VIEW test 
AS 
  SELECT cc_name, 
         COUNT()             AS total, 
         (SELECT COUNT() 
          FROM   bed 
          WHERE  cc_name = bed_outer.cc_name
          AND    respatient_id > 0) AS occupied_beds, 
         (SELECT COUNT(*) 
          FROM   bed 
          WHERE  cc_name = bed_outer.cc_name
          WHERE  respatient_id IS NULL) AS free_beds 
  FROM   bed AS bed_outer
  GROUP  BY cc_name;

(相関サブクエリについては、 http://en.wikipedia.org/wiki/Correlated_subqueryを参照してください。)

ただし、OMG Poniesとa1ex07が言うように、必要がなければ、実際にはサブクエリを使用する必要はありません。

于 2011-10-23T16:11:26.207 に答える
4

問題は、副選択が複数の値を返していることです-IE:

SELECT ...
       (SELECT COUNT(*) 
          FROM bed 
         WHERE respatient_id IS NULL 
      GROUP BY cc_name) AS free_beds,
       ...

...それぞれの行を返しcc_nameますが、SQLは副選択の結果セットの圧縮をサポートしていません-したがってエラーです。

副選択は必要ありません。これは、次を使用してテーブルを1回パスすることで実行できます。

  SELECT b.cc_name, 
         COUNT(*) AS total, 
         SUM(CASE 
               WHEN b.respatient_id > 0 THEN 1 
               ELSE 0 
             END) AS occupied_beds, 
         SUM(CASE 
               WHEN b.respatient_id IS NULL THEN 1 
               ELSE 0 
             END) AS free_beds 
    FROM bed b
GROUP BY b.cc_name
于 2011-10-23T16:05:54.140 に答える
1

サブクエリは複数の行を返します。私はあなたが次のようなものが必要だと思います:

 SELECT COUNT(*) AS total, 
 COUNT(CASE WHEN respatient_id > 0 THEN 1 END) AS occupied_beds,
 COUNT(CASE WHEN respatient_id IS NULL THEN 1 END) AS free_beds          
 FROM   bed 
 GROUP  BY cc_name

+ピボットを使用することもできますWITH ROLLUP(主に学習目的で、はるかに長いクエリです):

SELECT cc_name, 
MAX(CASE 
 WHEN num_1 = 1 THEN tot_num END) AS free_beds,

MAX(CASE 
 WHEN num_1 = 2 THEN tot_num END) AS occupied_beds,

MAX(CASE 
 WHEN num_1 = IS NULL THEN tot_num END) AS total

FROM
(SELECT cc_name, CASE 
WHEN respatient_id > 0 THEN 1
WHEN respatient_id IS NULL THEN 2
ELSE 3 END as num_1,
COUNT(*) as tot_num
FROM  bed
WHERE 
CASE 
WHEN respatient_id > 0 THEN 1
WHEN respatient_id IS NULL THEN 2
ELSE 3 END != 3
GROUP BY cc_name,
num_1 WITH ROLLUP)A
GROUP BY cc_name
于 2011-10-23T16:06:14.577 に答える
0
SELECT COUNT() 
          FROM   bed 
          WHERE  respatient_id > 0 
          GROUP  BY cc_name

サブクエリでグループバイを削除する必要があるため、おそらく次のようなものです

SELECT COUNT(*) 
          FROM   bed 
          WHERE  respatient_id > 0 

またはおそらく-アプリケーションロジックが何であるかに応じて....

SELECT COUNT(*) from (
          select count(*),cc_name FROM   bed 
          WHERE  respatient_id > 0 
          GROUP  BY cc_name) filterview
于 2011-10-23T16:02:35.103 に答える