我有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):