2012-03-28 18 views
1

6つのテーブルがありますが、残念ながらプライマリ/外部キー関係はエンコードされていません。私はビューを作成しようとしましたが、私はテーブルだけで満足しています。6つのテーブルをプライマリまたは外部キーなしで結合できません - メモリ不足

私は6つのテーブルを結合することができましたが、3350万の行を返した後(cleanInventtransは170万行あり、テーブルが追加されるたびに前のテーブルの組み合わせでテーブルが乗算されると仮定しています)メモリが不足しています。さて、私はこれが正しいことではないことを理解しています。もし私が仮定している結果を得るのであれば。

しかし、彼らは主-外国があると仮定し、私は http://www.daniweb.com/web-development/databases/ms-sql/threads/123446/problem-using-join-with-six-tables
SQL joining 6 tables
Unable to relate two MySQL tables (foreign keys)


オンライン質問のカップルを見ていると私は
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 

編集: Saleslineとsalestableは、P/F-キーで関連することができ、しかしinventtableとsaleslineはアイテムIDという名前の列を持つ越えた関係を持っていませんこれは両方で同じです。しかし、これらは重複しており、キーとして機能することはできません。

EDIT2:

Saleslineとinventtableが何らかの理由で関連することができません:私はinventtableにアイテムIDをチェックした

'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'. 

、それがユニークで、アイテムIDの倍数はsaleslineであります - すべてのIDが本質的に数値ではなく、一部に文字が含まれています。これが問題を引き起こしているのかどうかはまだ分かりません。

Edit3:
発明データベースに存在しない生理食塩水にIDがあるため、外部主関係は失敗します。非常に奇妙な。

答えて

2

これらの6つのテーブルからすべての行を戻すことはできません。いくつかのテーブルに1million以上の行がある場合、少なくともこれらのテーブルの1つ、つまりWHERE句を使用するCleanIventTransテーブルをフィルタリングします。プライマリキーと外部キーを追加しない場合は、少なくともインデックスを追加してパフォーマンスを向上させてください。

+0

私のデータベースではなく、Dynamics AXデータベースですが、プライマリ/外部キーがアプリケーション層にあると仮定しています。 行をフィルタリングすると、分析を実行するのに必要なデータが得られません。私はどのようにこれにプライマリ/外部キーを追加するかわからない、各IDを自分自身を作成することなく。 – Tommy

+0

パフォーマンスを向上させるには、プライマリ/外部キーをデータベースレイヤーに追加することをお勧めします。一度に3350万行を分析する必要があるのはなぜですか? はあなたが実行することができる外部キーを追加するには: ALTER TABLE YourTable をFOREIGN KEY(P_ID) REFERENCESのTABLETOREFERENCE(フィールド)を追加 –

+0

さて、私は何をしようとしていることは、分析のために、関連するすべての列を含むテーブルを作成することです私はやろうとしている。これまでのテーブルのやり方は、30mil以上の行をもたらしてしまったため、メモリが不足しているので、30milの行を分析したいという質問はありませんが、関連する列で構成されていますが、残念ながら6つの異なる表にまたがっています。 は、私はあなたがdbo.AX_CUSTPACKINGSLIPJOUR INNER FROM を使用しているあなたのコード dbo.AX_SALESTABLE INNER JOINのに気づいたsaleslinesとinventtable – Tommy

関連する問題