1

次の SQL ステートメントで、1 行ではなく正しいカウントで複数の行が返されるのはなぜですか?

SELECT
  (
    SELECT COUNT(*) FROM schema.table t WHERE t.column IS NULL
  ) AS t_Inserts,
   (
    SELECT COUNT(*) FROM schema.table t WHERE t.column IS NOT NULL
  ) AS t_Updates
FROM
  schema.table t;

注:私はオラクルを使用しています。

Output:
t_Inserts,t_Updates
100,200
100,200
100,200
100,200
100,200
...
4

2 に答える 2

1

投稿したクエリは、t_Insertsサブクエリ (およびt_Updatesサブクエリ) を のすべての行に対して 1 回実行しschema.tableます。句schema.tableなしでクエリを実行しているため、結果セットには、持っているのと同じ数の行が含まれている必要があります。単一の行が必要な場合は、テーブルからWHEREschema.tableSELECTdual

SELECT
  (
    SELECT COUNT(*) FROM schema.table t WHERE t.column IS NULL
  ) AS t_Inserts,
   (
    SELECT COUNT(*) FROM schema.table t WHERE t.column IS NOT NULL
  ) AS t_Updates
FROM
  dual

ただし、次のようなことを行う方がおそらくより効率的です。

SELECT SUM( CASE WHEN t.column IS NULL THEN 1 ELSE 0 END ) t_inserts,
       SUM( CASE WHEN t.column IS NOT NULL THEN 1 ELSE 0 END ) t_updates
  FROM schema.table t;
于 2012-12-06T17:51:30.743 に答える
1

@Justinの回答(+1)の代替:

SELECT COUNT(*)-COUNT(column) AS t_Inserts, COUNT(column) AS t_Updates
FROM schema.table;
于 2012-12-06T17:57:13.210 に答える