5

私は最近 SQL の独学を始めたばかりで、さまざまなチュートリアルから必要なものをほぼすべてまとめることができましたが、これには頭を壁にぶつけてしまいます。製品のすべての部品表情報を含むテーブルがあります。PPN_I、CPN_I、QUANTITY_I、BOMNAME_I の 4 つの列だけが必要です。これらは、それぞれアイテム番号、原材料番号、数量、および BOMName です。多くの BOM にはサブアセンブリが含まれています。レベルに関係なく、BOM のすべてのコンポーネントをリストする結果セットが必要です。再帰クエリを使用する必要があると確信していますが、それを取得することはできず、助けていただければ幸いです。他にも BOM に関する質問がいくつかあることは知っていますが、それらはすべて異なるテーブル構造を持っているようです。そう -

まず、推測とチェック作業を容易にするために、特定の 1 つの項目の結果を取得しようとしました。完了したら、すべてのアイテムのレポート、または少なくともアイテムのリストが必要になります。これらのアイテムの多くは構成可能で、複数の BOM があります。デフォルトのセットアップを取得するために、空の BOM 名を探しています。

これを実行して、最初のレベルを取得できます。

    select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 1 as BOMLevel
    from BM010115 bm
    where bm.PPN_I like '0123105-HWT' and bm.BOMNAME_I like ''

問題は、行の 1 つ (または複数) がサブアセンブリである cpn_i 値を持つことです。サブアセンブリを構成する要素を確認するには、最初のクエリの各結果を同じクエリに戻す必要があります。

    select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 2 as BOMLevel
    from BM010115 bm
    where bm.PPN_I like 'ZC-BASESUBLIM' and bm.BOMNAME_I like ''

明らかに、これはこれを行う最も効果的な方法ではありません。試してみましたが、正しい結果が得られないようです。私はこれについてさまざまなバージョンを試してきましたが、最近行った/最も近いものを以下に示します。

    With BMStudy as
    (select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 1 as BOMLevel
    from BM010115 bm
    where bm.PPN_I like '0123105-HWT' and bm.BOMNAME_I like ''

    UNION ALL

    select bb.ppn_i, ba.cpn_i, bb.bomname_i, ba.quantity_i, 2 as BOMLevel
    from BM010115 bb, BMStudy ba
    where bb.BOMNAME_I like '' and ba.PPN_I = bb.CPN_I)
    select * from BMStudy

これは、結果の最初のレベルのみを返します。BOM の深さが 3 レベルを超えるとは思いませんが、それがどのレベルであるかを示す列が必要です。誰かが私を正しい方向に向けたり、どこが間違っていたのかを教えてくれますか?

TL;DR - BOM 内のすべてのコンポーネントを取得し、最初のクエリのすべての結果の BOM コンポーネントを取得して結果セットに追加するクエリが必要です。


ありがとう

4

2 に答える 2

5

あなたの論理は基本的に大丈夫だったと思います。ここでは、2 つの改善点を示します。まず、レベルがインクリメンタルであるため、再帰で何が起こるかを確認できます。次に、明示的な結合を使用します。

With BMStudy as (
      select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 1 as BOMLevel
      from BM010115 bm
      where bm.PPN_I like '0123105-HWT' and bm.BOMNAME_I like ''
      UNION ALL
      select bb.ppn_i, ba.cpn_i, bb.bomname_i, ba.quantity_i, (BOMLevel + 1) as BOMLevel
      from BMStudy ba join
           BM010115 bb
           on ba.cpn_i = bb.ppn_i
      where bb.BOMNAME_I like ''
     )
select * from BMStudy;

あなたの問題は状態だと思いますwhere bb.BOMNAME_I like ''。この値がNULL空白ではなく実際にある可能性はありますか?

また、この非再帰的な 1 レベル ダウン クエリが何をするかを確認する必要があります。

      select bb.ppn_i, ba.cpn_i, bb.bomname_i, ba.quantity_i, (BOMLevel + 1) as BOMLevel
      from BM010115 ba join
           BM010115 bb
           on ba.cpn_i = bb.ppn_i
      where bb.BOMNAME_I like '' and
            (ba.PPN_I like '0123105-HWT' and ba.BOMNAME_I like '')
于 2013-08-25T11:45:26.680 に答える