【问题标题】:How do i get my MAX SQL Select statement to work within my inner join如何让我的 MAX SQL Select 语句在我的内部联接中工作
【发布时间】:2023-04-03 16:41:01
【问题描述】:

我写了一个小的内部连接,它从两个不同的数据库表中获取列; WKS_LOG_VIEW 和 FDE_XML_VIEW。我在 ACID/AID 上匹配它们,并在所选日期和机器内返回数据(这有效)。然后我尝试添加一个 MAX 选择查询,它只会放入最新的 EventTime 行。因为我只希望每个 EventTime 条目有一条记录。我不需要很多 EventTime 条目,只是最新的。我的查询没有返回任何条目。

select 
EXCDS1.dbo.FDE_XML_VIEW.ACID,
EXCDS1.dbo.FDE_XML_VIEW.SID,
EXCDS1.dbo.FDE_XML_VIEW.STAR,
EXCDS1.dbo.FDE_XML_VIEW.ROUTE, 
EXCDS.dbo.WKS_LOG_VIEW.AID,
EXCDS.dbo.WKS_LOG_VIEW.Sector,
EXCDS.dbo.WKS_LOG_VIEW.LocalCoAltIn
EXCDS.dbo.WKS_LOG_VIEW.EventTime
from EXCDS1.dbo.FDE_XML_VIEW
inner join
EXCDS.dbo.WKS_LOG_VIEW 
on AID = ACID
where
LastUpdateMachine = 'R02'
and
convert (date, EventTime) = '2021-03-11'
and
EXCDS.dbo.WKS_LOG_VIEW.EventTime = (SELECT MAX(lv.EventTime) from EXCDS.dbo.WKS_LOG_VIEW as lv
where
lv.AID = EXCDS.dbo.WKS_LOG_VIEW.AID)
order by ACID, EventTime;

我对 SQL 很陌生,如果我犯了明显的错误,敬请见谅。

【问题讨论】:

  • 仅供参考3+ naming is to be deprecated;不要使用 3 部分(或您所听到的 4 部分)命名来引用您的列,为您的对象命名,然后使用这些别名来限定您的代码,这将使它更加简洁和可读。空格和良好使用换行符也很重要。该查询很难阅读,看起来您有 2 个WHEREs(这是不允许的)。

标签: sql sql-server


【解决方案1】:

我认为问题在于查询中的附加过滤。解决这个问题的最简单方法是使用row_number()

select fw.*
from (select f.ACID, f.SID, f.STAR, f.ROUTE, 
             wl.AID, wl.Sector, wl.LocalCoAltIn wl.EventTime,
             row_number() over (partition by wl.AID order by wl.EventTime) as seqnum
      from EXCDS1.dbo.FDE_XML_VIEW f join
           EXCDS.dbo.WKS_LOG_VIEW wl
           on wl.AID = f.ACID
      where LastUpdateMachine = 'R02' and
            convert(date, wl.EventTime) = '2021-03-11'
     ) fw
where seqnum = 1;
order by ACID, EventTime;

注意事项:

  • 使用表别名。它们使查询更易于编写和阅读。
  • 限定所有列引用。我仍然不知道LastUpdateMachine 来自哪个表。
  • 您的查询似乎引用了两个视图,而不是两个。这对您的查询无关紧要。我只是想确保您了解视图和表格之间的区别。

【讨论】:

  • 谢谢 Gordon 我将使用别名,是的,它们是我刚刚检查过数据库的视图。在上面的例子中,选择 fw。 * 知道拿起两个 TABLES,因为它们有 f 和 wl 的别名?我只是想了解其中的逻辑。
  • @ZZBeard 。 . .没有。fw 是子查询的别名。
  • 很遗憾,我无法让子查询工作。结果返回空白。
  • @zzBeard 。 . .仅当子查询未返回任何行时,此查询才会返回任何行 - 它本质上是您问题中的查询。您的查询是否返回行?
  • 这对戈登很有效。我的 VIEW 被清空了,我不知道。现在系统中有数据,它只提取一个seqnum
猜你喜欢
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2020-01-08
  • 2022-06-11
相关资源
最近更新 更多