目前使用查询来订购另一个查询;这些可以合并吗?

时间:2017-09-26 19:32:36

标签: sql ms-access

现在我有一个查询查询的表单,以便对其进行排序。我知道可以通过多个条件进行排序,但是当我尝试将第二个订单条件添加到查询时,它似乎没有做任何事情。

这是随机LP Picker查询。它让我从数百个列表中随机选择10个LP:

SELECT TOP 10 Artists.OriginalName, LPs.Album, LPs.rating, LPs.[Notable 
Songs], LPs.Comments, [Listened (LPs)].last_date, [Listened 
(LPs)].times_listened, LPs.LPID
FROM (LPs INNER JOIN Artists ON LPs.Performer_id = Artists.ArtistID) INNER 
JOIN [Listened (LPs)] ON LPs.LPID = [Listened (LPs)].disc_id
WHERE (((LPs.Status)=1 Or (LPs.Status)=5) AND ((LPs.[Media Type])=1))
ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]);

在我的表单中,我按日期订购查询:

SELECT [Random LP Picker].*
FROM [Random LP Picker]
ORDER BY [Random LP Picker].last_date;

我尝试将两种排序放入Random LP Picker查询中,因此它看起来像:

ORDER BY  Rnd(Int(Now()*[LPID])-Now()*[LPID]), [Listened (LPs)].last_date;

这样做不会给我按last_date排序的列表。我也试过逆转这两个排序的项目,但由于我的知识有限,导致几个字段根本不出现。

如果我可以在一个查询中完成所有操作,那将非常有用。有可能吗?

注意:有几个人说,为什么不按日期排序。问题是,这个查询正在做的是随机排序所有条目然后返回前10个。所以如果我通过Rnd(...)部分删除订单,那么我不再获得10个随机条目。如果有另一种方法可以在不使用ORDER的情况下获得10个随机条目,那么我很乐意这样做,但这是我知道的唯一方法。

2 个答案:

答案 0 :(得分:1)

考虑将查询移动到派生表(即FROM中的子查询)并对外部查询进行排序:

SELECT main.* 
FROM
  (SELECT TOP 10 a.OriginalName, l.Album, l.rating, l.[Notable Songs], 
          l.Comments, p.last_date, p.times_listened, l.LPID
   FROM (LPs l INNER JOIN Artists a ON l.Performer_id = a.ArtistID) 
   INNER JOIN [Listened (LPs)] p ON l.LPID = p.disc_id
   WHERE ((l.Status IN (1,5)) AND (l.[Media Type]=1))
   ORDER BY Rnd(Int(Now()*l.[LPID])-Now()*l.[LPID])
  ) As main
ORDER BY main.last_date

答案 1 :(得分:0)

由于您希望最终结果集在last_date上排序,因此您的上一个ORDER BY应该在[Listened (LPs)].last_date上。子查询应根据随机数返回TOP 10行。

您可以尝试更换线路 ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]), [Listened (LPs)].last_date;

[Listened (LPs)].last_date;

修改后的查询将如下:

    SELECT Artists.OriginalName, LPs.Album, LPs.rating, LPs.[Notable 
    Songs], LPs.Comments, [Listened (LPs)].last_date, [Listened 
    (LPs)].times_listened, LPs.LPID
    FROM (LPs INNER JOIN Artists ON LPs.Performer_id = Artists.ArtistID) INNER 
    JOIN [Listened (LPs)] ON LPs.LPID = [Listened (LPs)].disc_id
    WHERE (((LPs.Status)=1 Or (LPs.Status)=5) AND ((LPs.[Media Type])=1)) 
    AND LPs.LPID IN (SELECT TOP 10 LPID FROM LPs ORDER BY Rnd(Int(Now()*[LPID])-Now()*[LPID]))
ORDER BY [Listened (LPs)].last_date;