根据它在另一个 table psql 中的可用性来排序一个 table 的结果
order the results of one table based on it's availability in another table psql
我有 5 tables A、A1、A2、A3、A4。
A与剩余4个table有外键关系。
我想要订单 A,首先检查 A1 中的可用性,然后在 A2 中,依此类推。
因此结果应按其在 A1、A2、A3、A4 中的可用性顺序显示。
select * from A as main
order by (select abc from A1 where main.abc = A1.abc), (select abc from A2 where main.abc = A2.abc), (select abc from A3 where main.abc = A3.abc), (select abc from A4 where main.abc = A4.abc)
如果 A 中有 10 条记录 table 那么我想要结果中的所有 10 条记录,但这些记录应按其在 A1、A2、A3 和 A4 中的可用性排序
将不胜感激。
使用LEFT JOIN
和COALESCE
select distinct A.*
from A
LEFT JOIN A1 ON A.abc = A1.abc
LEFT JOIN A2 ON A.abc = A2.abc
LEFT JOIN A3 ON A.abc = A3.abc
LEFT JOIN A4 ON A.abc = A4.abc
ORDER BY COALESCE(A1.abc,A2.abc,A3.abc,A4.abc)
不过,意义不大。排序将根据 abc
值。如果您打算根据 A1 - A4 中的某个值进行排序,则使用它代替 COALESCE
.
中的 abc
如果您希望行首先出现在 A1 中,那么您可以使用 ||
来根据 A1 - A4 的存在强制排序(如果 abc
属性是 varchar
)
select distinct A.*
from A
LEFT JOIN A1 ON A.abc = A1.abc
LEFT JOIN A2 ON A.abc = A2.abc
LEFT JOIN A3 ON A.abc = A3.abc
LEFT JOIN A4 ON A.abc = A4.abc
ORDER BY COALESCE('a' || A1.abc, 'b' || A2.abc, 'c' || A3.abc, 'd' || A4.abc)
使用COALESCE
SELECT A.*
FROM A LEFT JOIN A1 ON A.ID = A1.ID
LEFT JOIN A2 ON A.ID = A2.ID
LEFT JOIN A3 ON A.ID = A3.ID
LEFT JOIN A4 ON A.ID = A4.ID
ORDER BY COALESCE(A1.ID ,A2.ID ,A3.ID ,A4.ID )
您可以按 EXISTance 排序:
-- sample data
CREATE TABLE a ( abc integer not null primary key);
INSERT INTO a(abc)
select generate_series(1,25);
CREATE TABLE a2 AS select * FROM a where abc %2 = 0;
CREATE TABLE a3 AS select * FROM a where abc %3 = 0;
CREATE TABLE a5 AS select * FROM a where abc %5 = 0;
CREATE TABLE a7 AS select * FROM a where abc %7 = 0;
ALTER TABLE a2 ADD primary key(abc);
ALTER TABLE a3 ADD primary key(abc);
ALTER TABLE a5 ADD primary key(abc);
ALTER TABLE a7 ADD primary key(abc);
-- Query
select * from a
ORDER BY exists (select * from a2 where abc=a.abc) desc
, exists (select * from a3 where abc=a.abc) desc
, exists (select * from a5 where abc=a.abc) desc
, exists (select * from a7 where abc=a.abc) desc
, a.abc -- tie-breaker
;
结果:
CREATE TABLE
INSERT 0 25
SELECT 12
SELECT 8
SELECT 5
SELECT 3
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
abc
-----
6
12
18
24
10
20
14
2
4
8
16
22
15
21
3
9
5
25
7
1
11
13
17
19
23
(25 rows)
我有 5 tables A、A1、A2、A3、A4。 A与剩余4个table有外键关系。
我想要订单 A,首先检查 A1 中的可用性,然后在 A2 中,依此类推。
因此结果应按其在 A1、A2、A3、A4 中的可用性顺序显示。
select * from A as main
order by (select abc from A1 where main.abc = A1.abc), (select abc from A2 where main.abc = A2.abc), (select abc from A3 where main.abc = A3.abc), (select abc from A4 where main.abc = A4.abc)
如果 A 中有 10 条记录 table 那么我想要结果中的所有 10 条记录,但这些记录应按其在 A1、A2、A3 和 A4 中的可用性排序 将不胜感激。
使用LEFT JOIN
和COALESCE
select distinct A.*
from A
LEFT JOIN A1 ON A.abc = A1.abc
LEFT JOIN A2 ON A.abc = A2.abc
LEFT JOIN A3 ON A.abc = A3.abc
LEFT JOIN A4 ON A.abc = A4.abc
ORDER BY COALESCE(A1.abc,A2.abc,A3.abc,A4.abc)
不过,意义不大。排序将根据 abc
值。如果您打算根据 A1 - A4 中的某个值进行排序,则使用它代替 COALESCE
.
abc
如果您希望行首先出现在 A1 中,那么您可以使用 ||
来根据 A1 - A4 的存在强制排序(如果 abc
属性是 varchar
)
select distinct A.*
from A
LEFT JOIN A1 ON A.abc = A1.abc
LEFT JOIN A2 ON A.abc = A2.abc
LEFT JOIN A3 ON A.abc = A3.abc
LEFT JOIN A4 ON A.abc = A4.abc
ORDER BY COALESCE('a' || A1.abc, 'b' || A2.abc, 'c' || A3.abc, 'd' || A4.abc)
使用COALESCE
SELECT A.*
FROM A LEFT JOIN A1 ON A.ID = A1.ID
LEFT JOIN A2 ON A.ID = A2.ID
LEFT JOIN A3 ON A.ID = A3.ID
LEFT JOIN A4 ON A.ID = A4.ID
ORDER BY COALESCE(A1.ID ,A2.ID ,A3.ID ,A4.ID )
您可以按 EXISTance 排序:
-- sample data
CREATE TABLE a ( abc integer not null primary key);
INSERT INTO a(abc)
select generate_series(1,25);
CREATE TABLE a2 AS select * FROM a where abc %2 = 0;
CREATE TABLE a3 AS select * FROM a where abc %3 = 0;
CREATE TABLE a5 AS select * FROM a where abc %5 = 0;
CREATE TABLE a7 AS select * FROM a where abc %7 = 0;
ALTER TABLE a2 ADD primary key(abc);
ALTER TABLE a3 ADD primary key(abc);
ALTER TABLE a5 ADD primary key(abc);
ALTER TABLE a7 ADD primary key(abc);
-- Query
select * from a
ORDER BY exists (select * from a2 where abc=a.abc) desc
, exists (select * from a3 where abc=a.abc) desc
, exists (select * from a5 where abc=a.abc) desc
, exists (select * from a7 where abc=a.abc) desc
, a.abc -- tie-breaker
;
结果:
CREATE TABLE
INSERT 0 25
SELECT 12
SELECT 8
SELECT 5
SELECT 3
ALTER TABLE
ALTER TABLE
ALTER TABLE
ALTER TABLE
abc
-----
6
12
18
24
10
20
14
2
4
8
16
22
15
21
3
9
5
25
7
1
11
13
17
19
23
(25 rows)