当前位置: 首页 > 面试题库 >

SQL:如何在sql查询中保存订单?

嵇丰
2023-03-14
问题内容

我有PostgreSQL数据库,我尝试打印所有用户(人)。

当我执行此查询时

-- show owners 
-- sorted by maximum cars amount
SELECT p.id
  FROM car c JOIN person p ON c.person_id = p.id
  GROUP BY p.id
  ORDER BY COUNT(p.name) ASC;

我得到所有车主按汽车数量排序

输出: 3 2 4 1

当我尝试链接所有者ID时,所有订单都出错了。

SELECT *
FROM person p
WHERE p.id IN (
  SELECT p.id
  FROM car c JOIN person p ON c.person_id = p.id
  GROUP BY p.id
  ORDER BY COUNT(p.name) ASC);

输出:1 2 3 4和其他数据

你看比命令是错误的。所以这是我的问题,我该如何保存该订单?


问题答案:

解开混乱。先汇总,然后再加入:

SELECT p.*
FROM   person p
JOIN  (
   SELECT person_id, count(*) AS ct
   FROM   car
   GROUP  BY person_id
   ) c ON c.person_id = p.id
ORDER  BY c.cnt;

无需加入person两次。如果您计数 最多或所有行, 这应该是最快的。
对于 较小的选择相关子查询 更快:

SELECT p.*
FROM   person p
ORDER  BY (SELECT count(*) FROM car c WHERE c.person_id = p.id)
WHERE  p.id BETWEEN 10 AND 20;  -- some very selective predicate

至于您的原始作品:右边IN有一个 集合元素的顺序被忽略,因此ORDER BY在子类中毫无意义。



 类似资料:
  • 问题内容: 我在编写sql以从表中获取可用房间时遇到问题。我的表结构如下。 表:预订 桌子:房间 包含有关房间的详细信息,该表的主键是room_id,它具有1至10个房间,共10个房间。 我的问题是我想知道这些房间在2012年9月14日6:00 pm至21-09-2012 9:00 am之间可用,这意味着我应该只将room_id的结果作为1,3,5,7,8 ,9,10。 有人可以帮我编写SQL来从

  • 问题内容: 假设我有一个存储在这样的变量中的查询(它实际上是动态填充的,并且更复杂,但这是出于演示目的): 有没有一种方法可以检查查询是否返回任何结果?像这样的东西,但这是行不通的: 我能想到的唯一方法是将结果放入临时表中,然后从中进行查询,但这并不理想,因为动态查询中的列可以变化,而且我真的不需要临时表除了检查是否会返回某些行外,完全出于其他原因。有没有更好的办法? 问题答案: 尝试执行和用于查

  • 问题内容: 我已经编写了此查询以获取一些结果,如果我想将结果保存在数组中我该怎么办?我想在IF语句中使用col1和col2中的值,这就是为什么我正在考虑将它们保存在数组中的原因。 问题答案: 通常我为此使用一个类: 现在,您可以使用循环来填充列表,如果您确实需要数组: 请注意,我假定第一列是a ,第二列是a 。只是为了证明C#是类型安全的,以及如何使用这些方法。

  • 问题内容: 此查询将保存完整的日期和时间。但我只想保存时间而不是数据库中的日期。有任何查询可以做到这一点吗? 问题答案: 您的列必须设置为DATETIME或TIMESTAMP。 如果使用TIME类型,则查询将按预期工作。 如果您使用任何其他类型的列,则可以使用其他答案提到的CURTIME()方法或CAST(column AS TIME),但是这会占用更多的磁盘空间,并且如果使用select会导致查

  • 问题内容: 我目前有使用PIVOT生成如下表的查询: 我想做的是,但看起来像是拉伸,结果是值递减。 这是查询: 这样做会产生错误,因此可以指定列吗? 问题答案: 试试这个:

  • 问题内容: 我有如下查询 我想以某种方式重用 我简化了上面的查询,但是实际上上面的选择是巨大而复杂的。我不想负担确保两者同步 我没有任何以编程方式重用它的方法。排除了T-SQL。我只能写简单的查询。这是应用程序的限制。 有没有一种方法可以在单个语句中重用相同的子查询 问题答案: 如果您使用的是SQL Server 2005+,请使用公用表表达式(CTE):