0
  • テーブルTRANSにはトランザクション情報が含まれています(transaction_id, date, foo, bar
  • テーブルELEMにはトランザクションの要素が含まれています(transaction_id, detail_id
  • DETには要素の詳細が含まれています(detail_id, size, weight, category

クエリ:

select * from TRANS t 
join ELEM e on (t.transaction_id = e.transaction_id)
join DET d on (e.detail_id = d.detail_id)

ただし、TRANS1つ以上のELEM/DET行が関連付けられている場合があります。したがって、100行TRANSあり、クエリを実行すると、100行を超える値が返されますが、これは望ましくありません。

DETただし、。の行を持つトランザクションの数を知りたいのですがd.category=1、その条件で結合すると、100行未満になります(その条件の行のみ)。

ケーキも食べたいです。TRANS日付範囲内のすべての行を取得し、結果として行数を取得したいd.category=1。その場合、行が返さd.category != 1れる限り、そこに何があるかは気にしません。TRANS

4

3 に答える 3

2

LEFTJOINを連鎖させないでください。予期しないデータが発生する可能性があります。

注:これは、次の場合を意味します。

SELECT *
FROM a
LEFT JOIN b 
    ON a = b
LEFT JOIN c
    ON b = c

bcは厳密に1:1であり、次のように書くことを検討してください。

SELECT *
FROM a
LEFT JOIN
(
    SELECT *
    FROM b
    JOIN c
        ON b = c
) d
    ON a = d

したがって、次のような結果になります。

SELECT *
FROM TRANS t
LEFT JOIN
(
    SELECT *  -- DON"T USE *, this will fail ^1
    FROM ELEM e
    JOIN DET d
         ON e.detail_id = d.detail_id
) a
    ON t.transaction_id = a.transaction_id

^1-サブクエリで同じ名前の複数の列を選択することはできません。常に明示してください!!!

于 2012-11-20T17:28:33.263 に答える
0

このようなものをお探しですか?

SELECT COUNT(1) AS TRANSCOUNT, SUM(CASE WHEN d.category=1 THEN 1 ELSE 0 END) AS CAT1COUNT
FROM TRANS t 
join ELEM e on (t.transaction_id = e.transaction_id)
join DET d on (e.detail_id = d.detail_id)

caseステートメントは、d.categoryが1の場合にのみ、行(完全結合結果の各行に1つ)をカウントします。

OK、あなたの投稿の上部にある表の説明を見逃しました。あなたが望むかもしれません

select count(distinct detail_id)

また

select count(distinct transaction_id)

そこにも; どれを求めているのか完全にはわかりません

于 2012-11-20T16:52:35.290 に答える