繁体   English   中英

PostgreSQL:如何对不包含列上的联合查询进行排序?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM