[英]PostgreSQL: How to sort union query on not included column?
我尝试ORDER
2 UNION
ed查询。 运行此:
SELECT b.id
FROM book.book b
WHERE title ILIKE '%something%'
UNION
SELECT b.id
FROM book.book b
JOIN book.book_person bp
ON bp.bookID = b.id
JOIN person p
ON p.id = bp.personID
WHERE lastname ILIKE '%something%'
ORDER BY b.title ASC, b.year DESC, b.volume ASC
给我错误:
ERROR: 42P01: missing FROM-clause entry for table "b"
LINE 12: ORDER BY b.title ASC, b.year DESC, b.volume ASC
^
LOCATION: errorMissingRTE, parse_relation.c:3140
如果没有ORDER
-clause,它会正常工作。 当我包含要订购的cols时,它可以正常工作:
SELECT b.id, b.title, b.year, b.volume
FROM book.book b
WHERE title ILIKE '%something%'
UNION
SELECT b.id, b.title, b.year, b.volume
FROM book.book b
JOIN book.book_person bp
ON bp.bookID = b.id
JOIN person p
ON p.id = bp.personID
WHERE lastname ILIKE '%something%'
ORDER BY "title" ASC, "year" DESC, "volume" ASC
有比订购更多列更好的订购UNION
ed queris的方法吗?
这是因为首先创建UNION
结果,然后执行ORDER BY
。 title
等不再可作为UNION
结果的引用。 (基本上,UNION的绑定比ORDER BY的绑定更紧密。)
因此,要解决该问题,只需将第二个查询和ORDER BY语句放在方括号中,假设您只想订购该部分:
SELECT id
...
UNION
(SELECT id
...
ORDER BY title, etc)
如果您希望对整个查询进行排序,那么您的UNION查询将必须返回所有排序列,然后您将对其进行选择:
SELECT id
FROM (
SELECT id, title, etc
...
UNION
SELECT id, title, etc
) x
ORDER BY title, etc
这是正确的方法。 如果您只需要输出id
,只需用select id from (...)_
的select id from (...)_
包装现有查询即可。
根据文档 ,您需要在联合选择中包括要排序的列的原因是:
select_statement
是任何没有ORDER BY,LIMIT,FOR NO KEY UPDATE,FOR UPDATE,FOR SHARE或FOR KEY SHARE子句的SELECT语句。 (如果将子表达式括在括号中,则可以将ORDER BY和LIMIT附加到子表达式。不带括号的情况下,这些子句将应用于UNION的结果 ,而不是其右侧输入表达式。)
因此, ORDER BY
仅适用于联合的结果,当仅输出书ID时,该结果仅具有该列。 是的,要使这两个结果集都按其他列排序,它们必须位于UNION
两侧的SELECT
列列表中。
如何摆脱的union
完全?
SELECT b.id
FROM book.book b LEFT JOIN
book.book_person bp
ON bp.bookID = b.id LEFT JOIN
person p
ON p.id = bp.personID
WHERE b.title ILIKE '%something%' OR p.lastname ILIKE '%something%'
ORDER BY "title" ASC, "year" DESC, "volume" ASC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.