0

私は MySQL と MSSQL の経験が豊富ですが、自分自身を SQL の専門家とは考えていません。

Oracle データベースで SQL 作業を実行する必要があります。バージョンはまだわかりませんが、やや最近のはずです (10、11??)。

とにかく、2 つのテーブルにまたがる個別のレコードの数を数えなければなりません。master議論のために、それらを と と呼びましょうdetail

次の SQL は、データに対して必要な数値を示します。ただし、この SQL は最終的に UDF (または Oracle の同等物) に入れられます。しかし、私の質問は、より良い方法はありますか? 高度な Oracle 最適化を使用するか、より優れた SQL クエリを使用することもできます。

ありがとう

select count(*) from
(
  select 
    mas.barcode
  , det.barcode_val

  from mas 
    inner join det on (det.trans_id = mas.trans_id and mas.trans_sub_id = det.trans_sub_id)
  where 
    mas.trans_id = 12345
    and det.code_type = 'COMMODORE'
  group by
    mas.barcode
  , det.barcode_val
);

データ:

MAS

trans_id     trans_sub_id     barcode
-------------------------------------
12345                   1      COM_A
12345                   2      COM_A
12345                   3      COM_B


DET

trans_id     trans_sub_id     code_type     barcode_val
-------------------------------------------------------
12345                   1     COMMODORE     C64
12345                   1     COMMODORE     C64
12345                   1     TANDY         TRASH80
12345                   2     COMMODORE     C128
12345                   2     ATARI         800XL
12345                   2     COMMODORE     AMIGA500
12345                   3     COMMODORE     C64


Results before count
--------------------
COM_A     C64
COM_A     C128
COM_A     AMIGA500
COM_B     C64


Results after count
-------------------
4
4

2 に答える 2

1
SELECT 
COUNT(DISTINCT mas.barcode || det.barcode_val)
FROM mas 
INNER JOIN det 
ON (det.trans_id = mas.trans_id and mas.trans_sub_id = det.trans_sub_id)
WHERE 
mas.trans_id = 12345
AND det.code_type = 'COMMODORE'

また

SELECT COUNT(*) FROM ( 
  SELECT DISTINCT mas.barcode, det.barcode_val
  FROM mas 
  INNER JOIN det 
  ON (det.trans_id = mas.trans_id and mas.trans_sub_id = det.trans_sub_id)
  WHERE 
  mas.trans_id = 12345
  AND det.code_type = 'COMMODORE'
)
于 2012-11-07T21:47:43.927 に答える
0

を使用する場合

    COUNT(DISTINCT mas.barcode || det.barcode_val)   

パイプラインの間に必ず区切り文字を入れてください。

    COUNT(DISTINCT mas.barcode || '-' || det.barcode_val)   

たとえば、次のシナリオを想像してください。

    Column1    Column2   Column1 || Column2   Column1 || '-' || Column2
    A          B         AB                   A-B
    AB        <null>     AB                   AB-
    1          201       1201                 1-201
    <null>     1201      1201                 -1201

このテーブルには、4 つの異なる値を持つ 4 つの行があります。しかし、試してみると

    COUNT(DISTINCT COLUMN1 || COLUMN2)

2 つの「異なる」グループしか取得できません。これらのコーナーケースを回避しようとするためのヒントです。

于 2012-11-08T02:51:28.243 に答える