【问题标题】: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

【问题讨论】:

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

标签: sql vb.net join sql-server-ce


【解决方案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 中选择的字段吗?
    • 是的。我想打印采购订单的账单,需要购买详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    相关资源
    最近更新 更多