3

彼らは私の問題に対する簡単な答えだと確信しています。

2 つのテーブルがあります - 注文ヘッダー テーブル (「Order」と呼ばれる注文ごとに 1 行) と注文詳細テーブル (「Order_Line」と呼ばれる各注文ヘッダーごとに 1 行以上)。Sql Server2005 とその SSRS レポート ツールを使用しています。1 行だけを取得したいのですが、注文ごとに詳細テーブルにある行の数を取得しています。他の注文ヘッダー レベルのアイテムで表示したい値を取得するには、詳細テーブルに参加する必要があります。

select distinct を試しましたが、同じ結果が得られました。私のクエリは次のとおりです。

select o.order_num, o.cust_num, c.cust_desc, o.shipto_num, o.st_name, o.st_address1, o.ent_date, 
o.ord_date, o.req_date, ol.order_line, ol.seq_num, u.user_desc, ol.orig_inv_num, ol.prod_num,
p.prod_desc1, ol.prod_desc1, ol.prod_desc2, ol.grs_price, ol.disc_pct, ol.net_price, ol.ord_qty,
ol.opn_qty, ol.pck_qty, ol.bo_qty, ol.shp_qty, rs.rsn_code_desc, ol.supp_cde, ol.line_ctr,
v.vend_desc, ca.pline_desc, ca.major_grp, ol.major_grp, w.whse_desc, o.wb,s.ship_via_desc,       
sa.slsm_desc, t.ar_term_desc,
o.shp_date, o.sys_num, o.inv_Flag, o.inv_num, o.tot_ord_$,o.inv_date, o.ord_src, r.route_desc,
o.cred_type, o.cred_num, o.total_sale
from [order] o
left outer join order_line ol on o.order_num = ol.order_num
left outer join customer c on o.cust_num = c.cust_no
left outer join ship_via s on o.ship_via_num = s.ship_via_id
left outer join whse_addr w on o.shp_whse = w.whse_num
left outer join salesman sa on o.slsm_num = sa.slsm_num
left outer join terms t on o.ar_term_num = t.ar_term_num
left outer join [route] r on o.route_num = r.route_num
left outer join product p on ol.prod_num = p.prod_num
left outer join prc_ov_rsn rs on ol.prc_ov_rsn_code = rs.rsn_cod
left outer join vend v on ol.prim_vend_num = v.vend_num
left outer join [user_id] u on ol.[user_id] = u.[user_num] 
left outer join category ca on ol.pline_Num = ca.pline_Id
where o.cust_num = '606797'
order by o.cust_num, o.shipto_num, o.order_num

注文ごとの Order_Line レコードの数に関係なく、クエリが 1 行だけを返すようにするにはどうすればよいですか?

4

1 に答える 1

0

SQL Server自体を知らないので、一般的なSQLの観点からこれに答えようとします。うまくいけばそれは理にかなっていますが、私が完全にオフになっている場合はお知らせください。この回答を無効にします。

これを解決しようとする 1 つの方法は、 を使用する依存サブクエリを作成することですLIMIT 1。その結果、結合は最終的に 1 つの注文明細行のみと一致します。そのようです:

select ...all columns you want...
from [order] o
left outer join order_line ol on o.order_num = ol.order_num
left outer join customer c on o.cust_num = c.cust_no
left outer join ship_via s on o.ship_via_num = s.ship_via_id
left outer join whse_addr w on o.shp_whse = w.whse_num
left outer join salesman sa on o.slsm_num = sa.slsm_num
left outer join terms t on o.ar_term_num = t.ar_term_num
left outer join [route] r on o.route_num = r.route_num
left outer join product p on ol.prod_num = p.prod_num
left outer join prc_ov_rsn rs on ol.prc_ov_rsn_code = rs.rsn_cod
left outer join vend v on ol.prim_vend_num = v.vend_num
left outer join [user_id] u on ol.[user_id] = u.[user_num] 
left outer join category ca on ol.pline_Num = ca.pline_Id
where o.cust_num = '606797' AND order_line.order_num =
    (SELECT order_num 
     FROM order_line 
     WHERE order_line.order_num = order.order_num LIMIT 1)
order by o.cust_num, o.shipto_num, o.order_num

その結果、order_line テーブルから選択した列とともに各注文行が個別に取得されますが、1 つの order_line 行に制限されているため、結果セットでは注文ごとに 1 つの行しか取得できません。

適切なインデックス作成などにより、これにより大幅な追加の読み込み時間が発生しないことを願っています。これが理にかなっているかどうか教えてください。

注:どうやら SQL Server にはlimit、Oracle、MySQL、PostgreSQL、SQLite などで見られるような句がありませSELECT TOP 1...ん。 . 同様の答えを探してこれを読んでいる人は誰でも、明らかにLIMIT 1、その特定のDBMSで構文的に正しいものに置き換える必要があります。また、行数制限を表現する正しい方法を教えてください。

于 2013-10-15T22:36:27.637 に答える