1

私は6つのテーブルを持っていますが、残念ながらプライマリ/外部キーリレーションはエンコードされていません。私はビューを作成しようとしました、しかし私はテーブルだけで満足以上です。

6つのテーブルを結合することに成功しましたが、3350万行を返した後(cleanInventtransには170万行あり、テーブルが追加されるたびに、テーブルに前のテーブルの組み合わせが掛けられると仮定しています) 。さて、これが正しいやり方ではないことを私は理解しています。

オンラインでいくつか質問を見ました

http://www.daniweb.com/web-development/databases/ms-sql/threads/123446/problem-using-join-with-six-tables

6つのテーブルを結合するSQL

2つのMySQLテーブル(外部キー)を関連付けることができません

そして私は見た

http://www.techonthenet.com/sql/joins.php

ただし、主キーと外部キーの関係があることを前提としています。私のテーブルにはこれがありませんが、以下のSQLコードに示すように、さまざまなテーブル間で対応するフィールドがあります。私はこれらを使ってテーブルを一致させますが、どこかで、明らかに間違っているのです。

このようにすることで、結合する各テーブルの結果に本質的に乗算をかけていることがわかります。私はそれを行うより賢い/正しい方法があり、それが結果の量を管理サイズまで減らすことを望んでいました。

残念ながら、create文を提供することはできません。

View design with 6 tables.私が使っているコード:

SELECT     dbo.AX_SALESLINE.SALESID, dbo.AX_SALESLINE.ITEMID, dbo.AX_SALESLINE.QTYORDERED, dbo.AX_SALESLINE.SALESPRICE, dbo.AX_SALESLINE.LINEPERCENT, 
                  dbo.AX_SALESLINE.LINEAMOUNT, dbo.AX_SALESLINE.SALESQTY, dbo.AX_SALESLINE.CONFIRMEDDLV, dbo.CleanInventTrans.COSTAMOUNTPOSTED, 
                  dbo.CleanInventTrans.DATEPHYSICAL, dbo.AX_CUSTPACKINGSLIPJOUR.DELIVERYDATE, dbo.AX_SALESTABLE.CUSTACCOUNT, dbo.AX_SALESTABLE.SALESTYPE, 
                  dbo.AX_SALESTABLE.SALESSTATUS, dbo.AX_CUSTPACKINGSLIPJOUR.QTY, dbo.AX_PRODTABLE.PRODID
FROM         dbo.AX_CUSTPACKINGSLIPJOUR INNER JOIN
                  dbo.AX_SALESTABLE INNER JOIN
                  dbo.CleanInventTrans INNER JOIN
                  dbo.AX_INVENTTABLE ON dbo.CleanInventTrans.ITEMID = dbo.AX_INVENTTABLE.ITEMID INNER JOIN
                  dbo.AX_PRODTABLE ON dbo.AX_INVENTTABLE.ITEMID = dbo.AX_PRODTABLE.ITEMID INNER JOIN
                  dbo.AX_SALESLINE ON dbo.AX_INVENTTABLE.ITEMID = dbo.AX_SALESLINE.ITEMID ON dbo.AX_SALESTABLE.SALESID = dbo.AX_SALESLINE.SALESID ON 
                  dbo.AX_CUSTPACKINGSLIPJOUR.SALESID = dbo.AX_SALESLINE.SALESID

編集する セールスラインとセールステーブルはP / Fキーで関連付けることができますが、inventorytableとsaleslineはitemidという名前の列を持つ以外には関係がありません。これはどちらも同じです。しかし、これらは重複しており、キーとして機能することはできません。

編集2:

セールスラインと在庫を何らかの理由で関連付けることはできません。

'AX_INVENTTABLE' table saved successfully
'AX_SALESLINE' table
- Unable to create relationship 'FK_AX_SALESLINE_AX_INVENTTABLE'.  
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint   "FK_AX_SALESLINE_AX_INVENTTABLE". The conflict occurred in database "VS1", table  "dbo.AX_INVENTTABLE", column 'ITEMID'.

私はinventableでitemidをチェックしました、それはユニークです、そしてセールスラインにitemidの多数があります - しかし、すべてのIDが本質的に数字であるというわけではなく、文字を含むものもあります。これがまだ問題の原因となっているかどうかはわかりません。

編集3:

生理食塩水にインベントリに存在しないIDがあるため、外部とプライマリの関係は失敗します。非常に奇妙な。

1 답변


2

これら6つのテーブルからすべての行を取り戻さないでください。一部のテーブルに100万を超える行がある場合は、少なくともこれらのテーブルの1つ、つまりWHERE句を使用したCleanIventTransテーブルをフィルタ処理します。主キーと外部キーを追加しない場合は、少なくともパフォーマンスを向上させるためにインデックスを追加してください。


  • それは私のデータベースではなく、そのDynamics AXデータベースです。私は、プライマリ/外部キーが代わりにアプリケーション層にあると仮定しています。行を除外した場合、分析を実行するために必要なデータが得られません。各IDを自分で作成しなくても、これに主キー/外部キーを追加する方法すらわかりません。 - Tommy
  • パフォーマンスのためには、データベース層に主/外部キーを追加するのが最善です。一度に3350万行を分析する必要があるのはなぜですか。外部キーを追加するには、次のコマンドを実行します。ALTER TABLE YourTable ADD FOREIGN KEY(P_Id)関連情報TABLETOREFERENCE(Field) - Darren
  • さて、私がやろうとしているのは、私がやろうとしている分析に関連するすべての列を含むテーブルを作成することです。テーブルのこれまでのやり方では、30ミル以上の行が発生し、その後メモリ不足になっています。つまり、30ミルの行を分析したいという問題ではなく、もっと関連する列で構成されていますが、残念ながら6つの異なる表にまたがっています。 2つのテーブルにPFリレーションを追加しましたが、セールスラインとインベントリを使用しようとするとエラーが発生します - Tommy
  • あなたのコードでは、dbo.AX_CUSTPACKINGSLIPJOUR内部結合dbo.AX_SALESTABLE内部結合を使用していることに気付きました。あなたの内部結合で、結合するフィールドを指定してください。 - Darren
  • ああ、大丈夫、私は外国の主キー関係を作り始めました。すべての作業を終えた時点で、最小限の行数とリソースを使用してそれらすべてを結合する方法を把握する必要があります。それぞれの結合で結合するフィールドを配置する必要があることを頭に入れておいてください。 - Tommy

リンクされた質問


関連する質問

最近の質問