0

SQL とデータベースは初めてです。それらを使用して、学術論文のデータをコーディングしています(関連する情報タグをさまざまな文に割り当てます)。私は周りを見回しましたが、SQL に慣れていないため、答えを見つける正しい方法を見逃している可能性があります。

特定のフィールドのテーブルごとにコードのすべてのインスタンスをカウントしたいいくつかのテーブルがあります。コードには、必要に応じて更新できる一連のコードがあります。他のテーブルには、コードを使用して入力されるフィールドがあります。

コード
ID GR SR CT
1S
2A
3P
4 S
5 する
6 IO
7T
8 私
データ1
ID IGR ISR ICT
1 SST
2Pドット
3 SIO I
4SDOI
データ2
ID IGR ISR ICT
1 AST
2 AST
3 PST
4Pドット

予想された結果:
コード.GR DATA1.IGR DATA2.IGR
S 3 0   
0 2
P 1 2

次のコードを試しました:

SELECT "CODES"."CT",
COUNT ("IGR") AS "DATA1.IGR",
COUNT ("IGR") AS "DATA2.IGR"
FROM
"DATA1", "DATA2"
JOIN "CODES" ON "CODES"."GR" = "DATA1"."IGR"
JOIN "CODES" ON "CODES"."GR" = "DATA2"."IGR"
GROUP BY
"CODES"."GR"

これにより、テーブルごとのコードごとに 1000 秒という結果が得られますが、テーブルごとのコードごとに 100 未満と予想されます。さまざまな JOIN を試してみましたが、役に立ちませんでした。

コード番号は、列ごとに 15 ~ 20 以上です。SUM CASE WHEN は、コードを追加するたびに更新されないため、理想的とは言えません。クエリを一緒に UNION する方法がある場合、出力の形式は必ずしも固定されているわけではありません。理想的なクエリは、CODES.column からすべてのコードを取得し、すべてのインスタンスをカウントし、使用されていない場合は 0 を返します。この単一のクエリを 11 個のテーブルで実行したいと考えています。

HSQL データベース エンジンを実行する OpenOffice Base を使用しています。

助けてくれてありがとう

4

2 に答える 2

1

試す

SELECT c.GR, 
       COALESCE(a.IGR1, 0) IGR1,
       COALESCE(b.IGR2, 0) IGR2
  FROM codes c LEFT JOIN
(
  SELECT IGR, COUNT(*) IGR1
    FROM data1
   WHERE IGR IS NOT NULL
   GROUP BY IGR
) a ON c.GR = a.IGR LEFT JOIN
(
  SELECT IGR, COUNT(*) IGR2
    FROM data2
   WHERE IGR IS NOT NULL
   GROUP BY IGR
) b ON c.GR = b.IGR
 WHERE c.GR IS NOT NULL

また

SELECT c.GR,
       (SELECT COUNT(*) 
          FROM data1 
         WHERE IGR = c.GR) IGR1,
       (SELECT COUNT(*) 
          FROM data2 
         WHERE IGR = c.GR) IGR2
  FROM codes c
 WHERE c.GR IS NOT NULL

両方のクエリの出力:

| | GR | IGR1 | IGR1 | IGR2 | IGR2 |
--------------------
| | さ | 3 | 0 |
| | あ | 0 | 2 |
| | ぴ | 1 | 2 |

これは、MySql の両方のクエリのSQLFiddleデモです。HSQLDB でも問題なく動作するはずです。

于 2013-06-15T21:37:08.303 に答える
0

これは、Oracleでそれを行う方法です。

SELECT c.gr, d1.cnt, d2.cnt
  FROM codes c
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data1 GROUP BY igr) d1 ON c.gr=d1.igr
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data2 GROUP BY igr) d2 ON c.gr=d2.igr
;

ただし、0 ではなく null=blank が返されます。これを修正するには、次のようにします。

SELECT c.gr
     , CASE WHEN d1.cnt IS NULL THEN 0 ELSE d1.cnt END
     , CASE WHEN d2.cnt IS NULL THEN 0 ELSE d2.cnt END
  FROM codes c
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data1 GROUP BY igr) d1 ON c.gr=d1.igr
  LEFT JOIN (SELECT igr, COUNT(*) cnt FROM data2 GROUP BY igr) d2 ON c.gr=d2.igr
;
于 2013-06-15T19:31:05.743 に答える