【问题标题】:Multiple nested SELECT DISTINCTstatments using INNER JOIN on the same table在同一个表上使用 INNER JOIN 的多个嵌套 SELECT DISTINCTstatments
【发布时间】:2014-04-17 21:37:44
【问题描述】:

我一直在尝试编写一个查询,通过发布日期并忽略其余行来仅选择表中每个“Item No_”中最新的。我一直收到各种错误。最后一个令人烦恼,因为此时我看不到错误。这是查询的sn-p:

SELECT ri.* 
FROM [Rigid Industries$Item Ledger Entry] ri 
INNER JOIN 
  (SELECT DISTINCT [Item No_], MAX([Posting Date]) AS maxDate 
    FROM [Rigid Industries$Item Ledger Entry] 
    WHERE maxDate <= CONVERT(datetime, '2014-01-17 02:33:16.939') 
    GROUP BY maxDate, [Item No_]] 
  ) itDat 
  ON ri.[Item No_] = itDat.[Item No_] 
WHERE ri.[Quantity] > 0 
ORDER BY ri.[Location Code] DESC, ri.[Item No_] ASC, ri.[Posting Date] DESC;

在 Peter G 和 rs 的帮助下,我找到了解决方案。

SELECT E.*
FROM [Rigid Industries\$Item Ledger Entry] E
WHERE [Posting Date] = 
    (SELECT MAX(x.[Posting Date])
    FROM [Rigid Industries\$Item Ledger Entry] x 
    WHERE x.[Item No_] = E.[Item No_] 
    AND x.[Posting Date] <= CONVERT(datetime, '$dateYo')
    ) AND
    [Entry No_] = 
    (SELECT MAX(y.[Entry No_])
    FROM [Rigid Industries\$Item Ledger Entry] y
    WHERE y.[Item No_] = E.[Item No_] 
    )
AND E.[Quantity] > 0 
ORDER BY E.[Location Code] DESC, E.[Item No_] ASC, E.[Posting Date] DESC;

【问题讨论】:

  • SELECT E.* FROM [Rigid Industries\$Item Ledger Entry] E WHERE [Posting Date] = (SELECT MAX(x.[Posting Date]) FROM [Rigid Industries\$Item Ledger Entry] x WHERE x.[Item No_] = E.[Item No_] AND x.[Posting Date] 0 ORDER BY E.[Location Code] DESC, E.[Item No_ ] ASC, E.[发布日期] DESC;

标签: php sql join distinct


【解决方案1】:

你可以把你的查询改写成这个

SELECT E.*
    FROM [Rigid Industries$Item Ledger Entry] E
    WHERE [Posting Date] = (SELECT MAX(x.[Posting Date]) FROM 
                            FROM [Rigid Industries$Item Ledger Entry] x  
                            WHERE x.[Item No_] = E.[Item No_] AND 
                x.[Posting Date] <= CONVERT(datetime, '2014-01-17 02:33:16.939'))
AND E.[Quantity] > 0 
ORDER BY E.[Location Code] DESC, E.[Item No_] ASC, E.[Posting Date] DESC;

【讨论】:

  • 感谢您的建议。这比我试图做的更有意义。我接受了这个查询并将其与 Peter G 的建议结合起来。
  • 您仍然可以使用此查询以两行作为单个项目编号。我建议将 where 子句更改为更像这样的内容: WHERE [Entry No_] = (SELECT TOP 1 [Entry No_] FROM [Rigid Industries$Item Ledger Entry] x WHERE x.[Item No_] = E.[Item No_ ] AND x.[Posting Date]
【解决方案2】:

您有几个问题。一个语法错误是内部查询由maxdate 聚合,然后还有其他查询。那是不必要的。逻辑问题是你需要在on 子句中使用日期:

SELECT ri.* 
FROM [Rigid Industries$Item Ledger Entry] ri INNER JOIN 
     (SELECT [Item No_], MAX([Posting Date]) AS maxDate 
      FROM [Rigid Industries$Item Ledger Entry] 
      WHERE [Posting Date] <= CONVERT(datetime, '2014-01-17 02:33:16.939') 
      GROUP BY [Item No_]] 
     ) itDat 
     ON ri.[Item No_] = itDat.[Item No_] and
        ri.[Posting Date] = itDat.maxDate
WHERE ri.[Quantity] > 0 
ORDER BY ri.[Location Code] DESC, ri.[Item No_] ASC, ri.[Posting Date] DESC;

编写此类查询的另一种方法是使用not exists 子句和[Rigid Industries$Item Ledger Entry]([Item No_], [Posting Date]) 上的索引:

SELECT ri.* 
FROM [Rigid Industries$Item Ledger Entry] ri 
WHERE ri.[Quantity] > 0 AND
      NOT EXISTS (SELECT 1
                  FROM [Rigid Industries$Item Ledger Entry] ri2
                  WHERE ri2.[Item No_] = ri.[Item No_] AND
                        ri2.[Posting Date] > ri.[Posting Date]
                 )
ORDER BY ri.[Location Code] DESC, ri.[Item No_] ASC, ri.[Posting Date] DESC;

这句话的意思是:“从该表中获取名称太长且复杂的所有行,这样表中就没有其他行具有相同的项目编号和更大的发布日期。”

【讨论】:

  • 第二个建议与我得到的结果相同;也就是说,它将重复具有相同零件编号甚至相同日期的行。我试图让它每个零件号和日期只显示一个实例。
  • @BrandonShimek 。 . .只有在给定项目的最大发布日期有重复项时,这两个查询才应返回重复的项目编号。
  • 我试图避免项目编号的重复条目,而不是试图仅查找重复项。
【解决方案3】:

[Rigid Industries$Item Ledger Entry] 是否有主键或唯一索引?没有一个,这可能仍然会给您带来重复,但仍然是一种改进:

SELECT ri.* 
FROM [Rigid Industries$Item Ledger Entry] ri 
INNER JOIN 
  (SELECT [Item No_], MAX([Posting Date]) AS maxDate 
    FROM [Rigid Industries$Item Ledger Entry] 
    WHERE [Posting Date] <= CONVERT(datetime, '2014-01-17 02:33:16.939') 
    GROUP BY [Item No_] 
  ) itDat 
  ON ri.[Item No_] = itDat.[Item No_]
 AND ri.[Posting Date] = itDat.maxDate
WHERE ri.[Quantity] > 0 
ORDER BY ri.[Location Code] DESC, ri.[Item No_] ASC, ri.[Posting Date] DESC;

【讨论】:

  • 有一列“Entry No_”具有唯一值。每个部分的最早日期在逻辑上应该足以避免需要这个,但我不反对将其用于结果。
猜你喜欢
  • 1970-01-01
  • 2011-03-03
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多