2012-03-28 59 views
1

我有六个表,不幸的是没有任何主/外键关系编码。我试图创建一个视图,但是我只是对一张桌子感到满意。无法加入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代码所示。我使用这些来匹配表格,但是在某个地方,我显然做错了。

我明白,通过这样做,我基本上可以将结果与每个我加入的表相乘。我希望有一个更聪明/正确的方法来减少结果的数量到管理规模。

我很遗憾无法提供创建声明。

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没有超越有一个名为列的itemid的关系,两者都是一样的。但是这些都有重复,并且不能用作键。

EDIT2:

Salesline和inventtable不能出于某种原因有关:

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

我已检查的itemid在inventtable,它是独一无二的,在salesline有多个条目标识的 - 但不是所有的身份证都是数字性的,有些包含字母。我不确定这是否是导致问题的原因。

编辑3:
外部主要关系失败,因为在salines中存在不存在于可发现表中的ID。很奇怪。

回答

2

请不要带回这6个表中的所有行。如果某些表中有一百多万行加上至少过滤其中一个表,即使用WHERE子句的CleanIventTrans表。如果您不打算添加主键和外键,至少需要添加索引以帮助提高性能。

+0

它不是我的数据库,它是一个Dynamics AX数据库,我假设主/外键在应用程序层中。 如果我筛选出行,我不会得到必要的数据来运行我的分析。我甚至不知道如何为此添加主键/外键,而不必为自己创建每个ID。 – Tommy 2012-03-28 07:58:25

+0

为了提高性能,最好在数据库层添加主键/外键。为什么你一次需要分析3350万行? 要添加外键,你可以执行: ALTER TABLE YourTable 添加外键(P_ID) 参考TABLETOREFERENCE(场) – 2012-03-28 08:32:39

+0

好吧,我所要做的是创建一个包含所有相关列的分析表我正在努力。到目前为止,表格的制作方式已经产生了超过3千万行,然后它的内存耗尽 - 所以它不是一个想要分析30万行数据的问题,而是希望得到一张表格的问题。由相关列组成,不幸的是分布在6个不同的表格中。 我添加了一个PF relationtion两个表,但是我试图用saleslines和inventtable – Tommy 2012-03-28 09:03:18