2017-01-06 11 views
4

SqlUtil::AbstractTableメソッド(getRowIterator()など)で使用されるSELECT句の中にサブクエリを持つ選択ハッシュを持つ方法はありますか。Qorusネストされた選択ハッシュ

サブクエリがFROM句であっ発見された使用しかし、私はselect_option_superqueryに似た何かを見つけた:

SELECT t1.id, t1.order_id, 
    (SELECT COUNT(order_id) FROM tbl1 t2 WHERE t1.order_id = t2.order_id) as count, 
    t1.other_cols, 
    t3.other_cols 
    FROM tbl1 t1 left join tbl3 s on t1.id = t3.id 

望ましい結果を数えることである:私はのようなものを探していながら

SELECT serviceid, service_methodid FROM (SELECT serviceid,service_methodid..)... 

結果セットでorder_id

tbl1 
id order_id other_cols 
1 ord1  ... 
2 ord2  ... 
3 ord1  ... 

結果:

id order_id count other_cols 
1 ord1  2  ... 
2 ord2  1  ... 
3 ord1  2  ... 
+0

これは本当によく尋ねられる最初の質問です!それと幸運とStackOverflowへようこそ! – geisterfurz007

+1

どのDBMSを使用していますか?これはウィンドウ関数を使って解決できます: 'count(*)over(partition by order_id)as cnt' –

+0

@a_horse_with_no_name提案してくれてありがとう、それを使用します。 –

答えて

1

あなたは正確にあなたが(選択列とサブクエリで)何を望むかのようにこれを行うことはできませんが、あなたはあなたが言及したsuperqueryオプションを使用して、これを行うとSQLUTILでSQLウィンドウ関数を使用してすることができますcop_over() function

にようになりますコードは、次のとおりです。

list cols = (
    "id", 
    "order_id", 
    cop_as(cop_over(cop_count("order_id"), "order_id"), "count"), 
    # ... other columns to select here - this is in the inner query 
    ); 

hash sh = (
    "columns": cols, 
    "join": join_inner(t2, "t2", ("order_id": "order_id")) + 
      join_inner(t3, "t3", ("id": "id")), 
    "superquery": (
     "columns": (
      cop_distinct("id"), "order_id", "count" 
      # note put columns needed here without table prefixes, this is for the outer query 
     ), 
    ), 
    ); 

サブクエリがSQLUTILと少し直感に反するが、サブクエリはトップレベルのハッシュ引数で指定され、選択し、メインクエリ(上記の例のようにsuperqueryハッシュキーで指定されています。 t2に少なくとも1つの行が必要なクエリが生成されることに注意してください。 t2の行がオプションである場合

join_left()代わりのjoin_inner()使用。

次のコードは、上記のクエリのハッシュを実行し、生成されたSQLと結果を記録します:

string sql; 
list l = t1.selectRows(sh, \sql); 
log(LL_INFO, "sql: %s", sql); 
log(LL_INFO, "SQL results: %N", l); 

私はこれが役に立てば幸い!

+0

ありがとうございます、これは期待どおりに動作します! –

関連する問題