【问题标题】:Redundant rows in SQL Select with JoinSQL Select with Join 中的冗余行
【发布时间】:2015-04-15 02:31:52
【问题描述】:

我想问一下有没有办法修改我的 SQL Select 语句以防止出现如下所示的冗余行。

SELECT tblIssueCommsItem.ItemID, cardNo, tblIssueCommsEqp.currentQty FROM tblIssueCommsItem 
INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
INNER JOIN tblIssueCommsEqp ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID  
INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
WHERE SetID = 11 AND (cardNo = 'TK 14' OR cardNo = '') AND cardNo != 'Unassigned' 
AND tblIssueCommsItem.VoucherNo = 10006102 AND tblIssueCommsEqp.currentQty > 0
ORDER BY cardNo, serial

我得到了什么:

ItemID: 1386, cardNO: *blank*, currentQty: 10
ItemID: 1386, cardNO: *blank*, currentQty: 1
ItemID: 1387, cardNO: *blank*, currentQty: 10
ItemID: 1387, cardNO: *blank*, currentQty: 1
ItemID: 1101, cardNO: TK 14, currentQty: 10
ItemID: 1101, cardNO: TK 14, currentQty: 1
ItemID: 2575, cardNO: TK 14, currentQty: 10
ItemID: 2575, cardNO: TK 14, currentQty: 1

SetInfo 包含属于一个集合的不同EqpIDs。在这种情况下,集合是SetID 11。我想要实现的目标如下:

ItemID: 1386, cardNO: *blank*, currentQty: 10
ItemID: 1387, cardNO: *blank*, currentQty: 10
ItemID: 1101, cardNO: TK 14, currentQty: 10
ItemID: 2575, cardNO: TK 14, currentQty: 10

我意识到冗余行仅在我的集合中有超过 1 个项目时才会出现,其中 cardNO = 'TK 14'.如您所见,冗余行是带有currentQty = 1 的行。我的数据库中没有这样的记录。我认为它只显示为 1,因为它是一个 int 字段。 currentQty 不同,这些并不是真正重复的行,因此我不能使用 DISTINCT 来摆脱它。

我对@9​​87654332@ 的概念不好,但我尝试了各种JOIN 并产生完全相同的结果。

任何帮助表示赞赏!

更新:问题已解决。感谢那些澄清不提供默认整数的 SQL 行为的人。 tblIssueCommsEqp.*,帮我找出了罪魁祸首,并意识到我需要tblIssueCommsEqp.VoucherNo = 10000602 and tblIssueCommsItem.VoucherNo = 1000602 才能得到我想要的。

由于我的概念仍然很薄弱,我仍然不确定为什么如果我在一组中只有一件“TK 14”,一切都会正常进行。

对于帮助修改我的陈述的答案,这些可能也有效,但它们有点作弊,我只会将其用作最后的手段。

【问题讨论】:

  • 如果结果出现,tblIssueCommsEqp 中必须有 currentQty = 1 的行。如果您将 tblIssueCommsEqp.* 添加到选择中,您应该能够弄清楚它是哪一行。此外,检查表中的主键/唯一约束以检查连接中是否缺少其中一个。
  • "the redundant rows are the ones with currentQty as 1. There's no such record in my database." 再看一遍。 必须currentQty = 1 所在的数据库中有记录。即使数据库只是要填充一个默认整数(它不会这样做),默认整数是 0,而不是 1。
  • 感谢 JamesZ 和 Joel 的帮助。 tblIssueCommsEqp.* 对我来说是新的,它真的帮助了我,因为我有太多的记录。请把它作为答案。

标签: sql sql-server select join


【解决方案1】:

假设 SQL Server,类似于:

 group by tblIssueCommsItem.ItemID, cardNo, tblIssueCommsEqp.currentQty
 having max(tblIssueCommsEqp.currentQty)

不确定这是否适用于 order by,但希望能让您朝着正确的方向前进 :)

【讨论】:

    【解决方案2】:

    我想你想要:

    SELECT
      tblIssueCommsItem.ItemID,
      cardNo,
      MAX(tblIssueCommsEqp.currentQty)
    FROM
      tblIssueCommsItem
      INNER JOIN tblCommsItem
        ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID
      INNER JOIN tblIssueCommsEqp
        ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID
      INNER JOIN tblSetInfo
        ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID
    WHERE
      SetID = 11
      AND (
            cardNo = 'TK 14'
            OR cardNo = ''
          )
      AND cardNo != 'Unassigned'
      AND tblIssueCommsItem.VoucherNo = 100006102
      AND tblIssueCommsEqp.currentQty > 0
    GROUP BY  
      tblIssueCommsItem.ItemID,
      cardNo
    ORDER BY
      cardNo
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT tblIssueCommsItem.ItemID, cardNo, q.currentQty 
      FROM tblIssueCommsItem 
      INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
      INNER JOIN 
      (
          select EqpID, MAX(currentQty) as currentQty
          from tblIssueCommsEqp 
          group by EqpID
          having max(currentQty) > 0
      ) q ON tblIssueCommsItem.EqpID = q.EqpID  
      INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
      WHERE SetID = 11 AND (cardNo = 'TK 14' OR cardNo = '') 
          AND tblIssueCommsItem.VoucherNo = 100006102
          -- The below line is redundant, though it may still be useful in matching an index
          -- AND cardNo != 'Unassigned'   
      ORDER BY cardNo, serial
      

      【讨论】:

        【解决方案4】:

        这可能会有所帮助。我认为包含 max 函数 会有所帮助,因为您包含 max 内置函数,请在 中删除 tblIssueCommsEqp.currentQty > 0 条件 where 子句。

        SELECT tblIssueCommsItem.ItemID, cardNo, Max(tblIssueCommsEqp.currentQty) 
        FROM tblIssueCommsItem 
        INNER JOIN tblCommsItem ON tblIssueCommsItem.ItemID = tblCommsItem.ItemID 
        INNER JOIN tblIssueCommsEqp ON tblIssueCommsItem.EqpID = tblIssueCommsEqp.EqpID  
        INNER JOIN tblSetInfo ON tblSetInfo.EqpID = tblIssueCommsEqp.EqpID 
        WHERE SetID = 11 
        AND (cardNo = 'TK 14' OR cardNo = '') 
        AND cardNo != 'Unassigned' 
        AND tblIssueCommsItem.VoucherNo = 100006102 
        ORDER BY cardNo, serial;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-20
          相关资源
          最近更新 更多