2016-05-18 9 views
1

私はoracleにスクリプトを書きました。しかし、それは私に私が望む結果を与えるものではありません。 私はこれを必要とします、私は2つのテーブルがあると想像してください。 Order_tableとブックテーブル。 私の注文表は、この他のテーブルのテーブルの1つのフィールドを計算する

Select * 
From (
    Select Newtable.Counter As Value_id, 
     o.Id As Id, 
     o.Type_id As Type_id 
    From (
      Select (Count B.Order_Type) As Counter, 
        B.Order_Type As Id 
      From Book B 
      Where B.Deleted = 'F' 
      Group By B.Order_Type 
      Order By Count(B.Order_Type) Desc 
     ) newtable, 
     order_table o 
    where o.id = newtable.id 
    and o.type_id = 11 
) 
order by id asc; 

結果はこのようなものですように私のスクリプトがあり、この

ORDER_TABLE表のように

ID TYPE_ID VALUE_ID 
1 11  null 
2 11  null 
3 11  null 
4 12  null 
5 11  null 

帳表

ID ORDER_TYPE DELETED 
1  1   F 
2  null  F 
3  5   F 
4  5   F 
5  4   F 
6  4   F 
7  3   T 

です。

Value_ID TYPE_ID ID 
2   11  5 
2   11  4 
1   11  1 

2番目と3番目のIDに0カウントが表示されていません。カウントも表示できますか?

結果は次のようになります。

Value_ID TYPE_ID ID 
2   11  5 
2   11  4 
1   11  1 
0   11  2 
0   11  3 
+0

order_tableとbook_tableの関係は何ですか? – Prathyush

答えて

1

まず、それはこのミスがキャッチしにくい理由の一つだ、暗黙のJOIN構文(カンマ区切り)を使用しないでください!適切なJOIN構文を使用してください。

Select * 
    From (Select coalesce(Newtable.Counter,0) As Value_id, 
       o.Id    As Id, 
       o.Type_id  As Type_id 
     From order_table o 
     LEFT JOIN (Select Count(B.Order_Type) As Counter, B.Order_Type As Id 
        From Book B 
        Where B.Deleted = 'F' 
        Group By B.Order_Type 
        Order By Count(B.Order_Type) Desc) newtable 
      ON(o.id = newtable.id) 
     WHERE o.type_id = 11) 
order by id asc; 
+0

このクエリは以前の@sagiより高速ですか?ご協力いただきありがとうございます。スクリプトは私の問題を解決した:) –

+0

@Jo_bast大きな違いがあるとは思わない。問題はありません:) – sagi

+0

彼は数え違いがあります。固定@ MT0 – sagi

0

Oracleのセットアップ

CREATE TABLE order_table (id, type_id, value_id) AS 
SELECT 1, 11, CAST(NULL AS INT) FROM DUAL UNION ALL 
SELECT 2, 11, CAST(NULL AS INT) FROM DUAL UNION ALL 
SELECT 3, 11, CAST(NULL AS INT) FROM DUAL UNION ALL 
SELECT 4, 12, CAST(NULL AS INT) FROM DUAL UNION ALL 
SELECT 5, 11, CAST(NULL AS INT) FROM DUAL; 

CREATE TABLE book (id, order_type, deleted) AS 
SELECT 1, 1, 'F' FROM DUAL UNION ALL 
SELECT 2, NULL, 'F' FROM DUAL UNION ALL 
SELECT 3, 5, 'F' FROM DUAL UNION ALL 
SELECT 4, 5, 'F' FROM DUAL UNION ALL 
SELECT 5, 4, 'F' FROM DUAL UNION ALL 
SELECT 6, 4, 'F' FROM DUAL UNION ALL 
SELECT 7, 3, 'T' FROM DUAL; 

クエリ

SELECT COUNT(b.order_type) AS value_id, 
     o.id, 
     o.order_type 
FROM order_table o 
     LEFT OUTER JOIN 
     book b 
     ON (o.id = b.order_type AND b.deleted = 'F') 
WHERE o.type_id = 11 
GROUP BY o.id, o.type_id 
ORDER BY value_id DESC, id DESC; 

第二には、あなたの問題は、あなたがleft join、ないinner joinを必要とするので、これを試してみてくださいということです

出力:しかし

VALUE_ID ID TYPE_ID 
-------- -- ------- 
     2 5  11 
     1 1  11 
     0 3  11 
     0 2  11 

、あなたがレガシーOracle構文をコンマが、結合を使用したかったのならば、あなたと同じ結果を得ることができます。

SELECT COUNT(b.order_type) AS value_id, 
     o.id, 
     o.order_type 
FROM order_table o, 
     book b 
WHERE o.type_id  = 11 
AND b.order_type (+) = o.id 
AND b.deleted (+) = 'F' 
GROUP BY o.id, o.type_id 
ORDER BY value_id DESC, id DESC; 

しかしはしないでくださいANSI/ISO結合は結合条件を理解するのがずっと簡単です。

0

スカラーサブクエリでこれを行うこともできます。スカラーサブクエリは、他の回答に記述されている左側の結合バージョンよりパフォーマンスが優れているかもしれません。 (おそらく、オプティマイザは、とにかく左辺結合に書き換えるかもしれません!):

with order_table (id, type_id, value_id) as (select 1, 11, cast(null as int) from dual union all 
               select 2, 11, cast(null as int) from dual union all 
               select 3, 11, cast(null as int) from dual union all 
               select 4, 12, cast(null as int) from dual union all 
               select 5, 11, cast(null as int) from dual), 
      book (id, order_type, deleted) as (select 1, 1, 'F' from dual union all 
               select 2, null, 'F' from dual union all 
               select 3, 5, 'F' from dual union all 
               select 4, 5, 'F' from dual union all 
               select 5, 4, 'F' from dual union all 
               select 6, 4, 'F' from dual union all 
               select 7, 3, 'T' from dual) 
-- end of mimicking your tables; you wouldn't need the above subqueries as you already have the tables. 
-- See SQL below: 
select (select count(*) from book bk where bk.deleted = 'F' and bk.order_type = ot.id) value_id, 
     ot.type_id, 
     ot.id 
from order_table ot 
order by value_id desc, 
     id desc; 

    VALUE_ID TYPE_ID   ID 
---------- ---------- ---------- 
     2   11   5 
     2   12   4 
     1   11   1 
     0   11   3 
     0   11   2 
関連する問題