web-dev-qa-db-ja.com

VerticaUNIONとORDERBY

ORDER BY句を使用したいのですが、上部に特定のエントリが1つあります。これでうまくいくかもしれないと思いましたが、Verticaは2番目のクエリのORDERBY句を無視しています。

(SELECT country_id, country_name 
FROM country_dim 
WHERE country_dim.iso_country_code LIKE 'US')
UNION 
(SELECT country_id, country_name 
FROM country_dim 
WHERE country_dim.iso_country_code NOT LIKE 'US' 
ORDER BY country_name ASC)

その結果

12  United States of America
10  Germany
5   Brazil
6   Canada
7   China
8   France
4   Algeria
3   Aland Islands
2   Albania
8   Denmark
11  United Arab Emirates
13  Central African Republic
-1  Unknown
14  Svalbard and Jan Mayen

DDLは

CREATE TABLE country_dim
(
    country_id int NOT NULL,
    iso_country_code char(2) NOT NULL,
    country_name varchar(512) NOT NULL,
    create_ts timestamptz,
    update_ts timestamptz
);

ALTER TABLE country_dim ADD CONSTRAINT country_dim_pk PRIMARY KEY (country_id) DISABLED;
1
cosenmarco

クエリには、サブクエリではなく、最後にORDER BYが必要です(少なくとも標準SQLでは、括弧はオプションであり、Verticaで必要かどうかはわかりません)。

( SELECT country_id, country_name 
  FROM country_dim 
  WHERE iso_country_code LIKE 'US')
UNION 
( SELECT country_id, country_name 
  FROM country_dim 
  WHERE iso_country_code NOT LIKE 'US')     -- without ORDER BY
ORDER BY 
    CASE WHEN iso_country_code LIKE 'US' THEN 0 ELSE 1 END ASC,
    country_name ASC ; 

ただし、同じテーブルからすべてのデータを取得しているため、UNIONとサブクエリは必要ありません。

SELECT country_id, country_name 
FROM country_dim 
ORDER BY 
    CASE WHEN iso_country_code LIKE 'US' THEN 0 ELSE 1 END ASC,
    country_name ASC ; 
4
ypercubeᵀᴹ