Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法在缺少主键或外键的情况下联接6个表-内存不足_Sql_Sql Server_Tsql_Join - Fatal编程技术网

Sql 无法在缺少主键或外键的情况下联接6个表-内存不足

Sql 无法在缺少主键或外键的情况下联接6个表-内存不足,sql,sql-server,tsql,join,Sql,Sql Server,Tsql,Join,我有六个表,不幸的是没有任何主键/外键关系编码。我已经尝试创建一个视图,但是我非常喜欢只创建一个表 我已经设法连接了这六个表,但在返回3350万行(cleanInventtrans有170万行,每次添加更多表时,我假设这些表乘以上一个表的组合)后,内存不足。现在,我意识到这不是正确的方法,如果是的话,我会得到一个我假设的结果 我在网上看了几个问题 我已经看过了 但是,他们假设存在一个主外键关系,我的表没有这个关系,但是在不同的表之间有对应的字段,如下面的SQL代码所示。我用这些来匹配表格

我有六个表,不幸的是没有任何主键/外键关系编码。我已经尝试创建一个视图,但是我非常喜欢只创建一个表

我已经设法连接了这六个表,但在返回3350万行(cleanInventtrans有170万行,每次添加更多表时,我假设这些表乘以上一个表的组合)后,内存不足。现在,我意识到这不是正确的方法,如果是的话,我会得到一个我假设的结果

我在网上看了几个问题


我已经看过了

但是,他们假设存在一个主外键关系,我的表没有这个关系,但是在不同的表之间有对应的字段,如下面的SQL代码所示。我用这些来匹配表格,但在这条线上的某个地方,我显然做错了

我知道这样做实际上是将结果与我加入的每个表相乘。我希望有一种更聪明/正确的方法,将结果的数量减少到管理规模

很遗憾,我无法提供create语句

我正在使用的代码:

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的列之外没有其他关系,这两个列中的itemid是相同的。但这些都是重复的,不能作为钥匙使用

编辑2:

由于某些原因,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'.
我已经在inventtable中检查了itemid,它是唯一的,并且在salesline中有多个itemid-但是并非所有的ID本质上都是数字的,有些包含字母。我不确定这是否是导致问题的原因

编辑3:

外部主关系失败,因为列表中存在inventtable中不存在的ID。非常奇怪。

不要从这6个表中返回所有行。如果某些表中有超过100万行,则至少要对其中一个表进行筛选,即使用WHERE子句的CleanIventTrans表。如果不打算添加主键和外键,至少要添加索引以帮助提高性能

它不是我的数据库,它是Dynamics AX数据库,我假设主键/外键位于应用程序层。如果我过滤掉行,我将无法获得运行分析所需的数据。我甚至不知道如何添加主键/外键,而不必自己创建每个ID。为了提高性能,最好在数据库层添加主键/外键。为什么每次需要分析3350万行?要添加外键,可以执行以下操作:ALTER TABLE YourTable add foreign KEY(P_Id)REFERENCES TABLE To reference(Field)好吧,我要做的是创建一个表,其中包含我要进行的分析的所有相关列。到目前为止,该表的处理方式导致超过30 mil行,然后内存耗尽-因此,与其说想要分析30 mil行,不如说想要一个包含相关列的表,不幸的是,这些列分布在6个不同的表中。我在两个表中添加了一个PF关系,但是在尝试对saleslines和InventTable执行此操作时出现错误我注意到您在代码中使用的dbo.AX_CUSTPACKINGSLIPJOUR INNER JOIN dbo.AX_SALESTABLE INNER JOIN在内部联接中指定要联接的字段,比如SALESID,看看它是否过滤掉了行。啊,好的,我已经开始做外键关系了,现在就开始。在某个时候,当我完成了所有这些操作后,我必须弄清楚如何使用最少的行和资源使它们全部连接起来。我会记住,我应该在每个联接中放置一个要联接的字段。