具有相似数据的重复记录

Posted

技术标签:

【中文标题】具有相似数据的重复记录【英文标题】:Records Repeating with similar Data 【发布时间】:2015-05-27 07:36:31 【问题描述】:

我这里有这种情况,如上图所示。我正在开发一个库存系统,我需要检索交易记录。所有表都与主外关系相关,并使用INNER JOIN 连接。

目前,当查询触发时,我正在获取采购订单的所有记录。我需要检索交易记录。例如对于图像中的这个采购订单,我只进行了两次交易,我只想要两个记录作为交易结果。我知道我可以使用OUTER JOINS来做到这一点,我尝试过但没有得到正确的结果。

有人知道吗?

这是实际的查询:

SELECT tblPurchaseMain.Purchase_Main_ID, tblPurchaseMain.Purchase_Date, tblPurchaseMain.TotalAmount, tblSupplier.Supplier_Name, tblPurchaseDetail.Purchase_Detail_ID, tblPurchaseDetail.Quantity, tblPurchaseDetail.Rate, tblPurchaseDetail.Amount, tblProduct.Product_Name, tblProductCategory.Product_Category_Name, tblTransaction.Transaction_Date, tblTransaction.Transaction_Amount, tblTransaction.Transaction_Mode FROM tblPurchaseTransaction INNER JOIN tblPurchaseMain ON tblPurchaseTransaction.Purchase_Main_ID = tblPurchaseMain.Purchase_Main_ID INNER JOIN tblPurchaseDetail ON tblPurchaseMain.Purchase_Main_ID = tblPurchaseDetail.Purchase_Main_ID INNER JOIN tblSupplier ON tblPurchaseMain.Supplier_ID = tblSupplier.Supplier_ID INNER JOIN tblTransaction ON tblPurchaseTransaction.Transaction_ID = tblTransaction.Transaction_ID INNER JOIN tblProduct INNER JOIN tblProductCategory ON tblProduct.Product_Category_ID = tblProductCategory.Product_Category_ID ON tblPurchaseDetail.Product_ID = tblProduct.Product_ID

【问题讨论】:

顺便说一句,如果没有正确解释,请帮助我。 请张贴大图。我们无法读取您的查询。 我看不到图片的文字,太小了。 好的。让我编辑并重新发布图像。 外连接可以从一个表中获取数据,即使另一个表中没有数据。即使订单不属于交易的一部分,也可以获取订单。即使交易不包含订单,也可以获取交易。我不认为这是你需要的。外连接与您的问题无关。 【参考方案1】:

您似乎正在加入不相关的事物。

单个购买主条目有两个交易,但您有四个购买详细条目。

交易和购买细节之间似乎没有有效的关系,因此 SQL Server 基本上会向您显示每笔交易的每条购买细节记录。

您需要从查询中删除购买详细信息和产品,或者添加交易和购买详细信息之间的关系。

【讨论】:

【参考方案2】:

您忘记标记您的 DBMS。我想你使用的是 mysql 吗?因为您的查询中缺少 ON 子句,而 MySQL 是我所知道的唯一一个不报告此错误的 DBMS,而是默默地将 INNER JOIN 转换为 CROSS JOIN强>代替。修复此错误,看看是否能解决您的问题。

如果您仍然获得比您想要的更多的行,让我们更仔细地看一下:您的数据模型让您在每次交易和每次购买中都有很多交易。因此,如果您希望每笔交易有一条结果记录,那么您必须GROUP BY 交易并考虑要显示哪些聚合 字段。例如,对于一笔交易,这可能是SUM(tblPurchaseMain.TotalAmount)。但是,请注意,您可能仍会隐含地显示重复金额,因为同一笔购买可以在多个交易中进行。 (例如,总金额为 100 美元的购买 1 与交易 A 和 B 相关。因此您将显示 A 100 美元和 B 100 美元。)所以也许您根本不想显示 tblPurchaseMain.TotalAmount 甚至您的数据模型错误。

【讨论】:

感谢您的回答。它不是 MySQL。我使用 SQL Compact 4.0 作为数据库。根据您的帖子,SQLCe 是否默默地将 INNER JOIN 转换为 CROSS JOIN ?好吧,我尝试使用Group ByDistinct,但没有使用SUM() 函数。我将使用它并恢复。谢谢 我不知道 SQLCe。您的查询应该通过一个错误,因为您想要 INNER JOIN tblProduct,但不要使用 ON 子句指定条件。但是,我只是注意到 ON 子句 is 在那里,只是不在正确的位置(tblProductCategory 上有两个 ON 子句)。将 ON 子句移动到正确的位置。这可能会也可能不会改变您的结果。 不。查询工作得很好。我也发布了带有结果的图像,所以查询有效,但我没有得到想要的结果。 如果您想在每笔交易中显示一行,则可能涉及多个购买和产品。因此,对于您展示的每个字段,您必须决定哪个字段。交易的最新购买?还是第一个?金额最高的那个?所有涉及金额的总和?涉及的产品;字母表中第一个还是最后一个?交易中金额最高的那个?一般最常买的那一款? ... 关于查询:我只是说它在语法上不正确。您应该更正它,即使 dbms 让您的错误静默传递。你永远不知道你的语法错误是否会影响结果。【参考方案3】:

这可能是由于您的表链接,您可以尝试将关键字 DISTINCT 添加到您的选择语句中,请参见下面的示例。

SELECT DISTINCT FIELD1,FIELD2 from TABLE

【讨论】:

您的 select 语句中的某些字段具有唯一值。图片看不清楚 请参考上述cmets中的图片链接。 我认为这是因为您链接到表 tblPurchaseDetail,如果您链​​接到此表,则无法获得 2 行结果。 这是一个详细信息表,根据您的链接,其中包含 2 行或更多行。你真的需要在表 tblPurchaseDetail 中选择的字段吗? 是的。我想打印采购订单的账单,需要购买详细信息

以上是关于具有相似数据的重复记录的主要内容,如果未能解决你的问题,请参考以下文章

无法获取具有排名的重复数据删除记录

如何使用 Active Record 查找具有重复数据的记录

对于每条记录,还要为记录选择具有最高值的数据[重复]

SQL里 distinct 和 union 的区别?

我需要找到具有最大类别的记录[重复]

具有最新记录的 Oracle 查询 GROUP BY [重复]