【问题标题】:Selecting records from already returned results from another query从另一个查询的已返回结果中选择记录
【发布时间】:2019-09-11 07:38:19
【问题描述】:

我在表中维护车辆操作的历史记录,在执行查询以获取基于事务的记录后,我想从上述查询的已返回结果中选择基于 LIKE 条件的记录

这是我正在使用的查询(感谢@TimBiegeleisen Selecting unique records after order by clause)

SELECT TOP 1 WITH TIES HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate
FROM HVeh
WHERE ChangedDate >= @X AND ChangedDate <= @Y
ORDER BY ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC);

我想要的是期待这个查询的结果并根据车辆的停放位置来过滤它们。像

Select A,B,C from tblSites and (SELECT TOP 1 WITH TIES.. - this query)
where tblSites.Location LIKE '%LDN%'.....

附:我不能对当前查询使用这个 LIKE 条件,因为它会影响返回的结果,这可能导致返回不是最新修改记录的结果(我不想要)

我想我可以尝试如下方式(将其添加到当前查询的末尾),但我不确定它是否是最好的方法

 INNER JOIN Sites on Sites.Id = sd.Id AND Sites.Place LIKE '%LDN%'

sd指第一个子查询的别名

【问题讨论】:

  • tblSites 与您的第一个查询结果有何关联?
  • 基于HVeh表中的外键引用RefSites
  • 请在您的问题中添加示例数据。就目前而言,它对未来的任何人都没有太大帮助。

标签: sql sql-server


【解决方案1】:

您始终可以使用子查询或 CTE。

子查询:

SELECT ....
FROM tblSites INNER JOIN (
  SELECT TOP 1 WITH TIES HVeh.Id, HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate
  FROM HVeh
  WHERE ChangedDate >= @X AND ChangedDate <= @Y
  ORDER BY ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC)) sd ON sd.Id = tblSites.id
WHERE tblSites.Location LIKE '%LDN%'

注意:由于您没有指定要选择的列,我使用了.... 占位符。将其替换为所需的列名。

您也可以使用 CTE:

;WITH sd AS (
  SELECT TOP 1 WITH TIES HVeh.Id, HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate
  FROM HVeh
  WHERE ChangedDate >= @X AND ChangedDate <= @Y
  ORDER BY ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC))
SELECT ....
FROM tblSites INNER JOIN sd ON sd.Id = tblSites.id
WHERE tblSites.Location LIKE '%LDN%'

【讨论】:

  • 是的,这正是我正在考虑的如何去做......!谢谢:)
【解决方案2】:

您可以使用子查询。但是,如果您要这样做,请不要使用TOP (1) WITH TIES。尽管该方法有效,但它并不是最有效的方法——主要是因为它必须计算ROW_NUMBER() 并对所有数据进行排序。

所以,我会推荐:

SELECT . . .
FROM tblSites s INNER JOIN
     (SELECT HVeh.Id, HVeh.RefVehicleModel, HVeh.RefVehStatus, HVeh.ChangedDate,
             ROW_NUMBER() OVER (PARTITION BY HVeh.RefVehicleModel ORDER BY HVeh.ChangedDate DESC) as seqnum
      FROM HVeh
      WHERE ChangedDate >= @X AND ChangedDate <= @Y
     ) sd
     ON sd.id = s.id AND seqnum = 1
WHERE s.Location LIKE '%LDN%';

如果您希望结果按特定顺序排列,您可以在外部查询中添加ORDER BY

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多