Postgres 根据查询结果从表中选择

Jef*_*f G 1 postgresql postgresql-9.3

我有两个具有相同列的表,顺序相同。我希望根据子查询条件连接两个表之一。例如,假设我有以下架构:

CREATE TABLE b (
    bid SERIAL PRIMARY KEY,
    cid INT NOT NULL
);

CREATE TABLE a1 (
    aid SERIAL PRIMARY KEY,
    bid INT NOT NULL REFERENCES b
);

CREATE TABLE a2 (
    aid SERIAL PRIMARY KEY,
    bid INT NOT NULL REFERENCES b
);
Run Code Online (Sandbox Code Playgroud)

我想要一个查询,它根据某些条件在a1a2之间执行连接。就像是:

WITH z AS (
  SELECT cid, someCondition FROM someTable
)
SELECT *
FROM CASE z.someCondition THEN a1 ELSE a2 END
JOIN b USING (bid)
WHERE cid = (SELECT cid FROM z);
Run Code Online (Sandbox Code Playgroud)

但是,上述方法不起作用。根据存储在表z 中的某些布尔条件,是否有某种方法可以有条件地连接a1a2

wil*_*ser 5

如果条件是独占的(我希望它们是):只需使用智能联合构造同时执行查询和查询:UNION ALL

WITH z AS (
  SELECT cid
        , (cid %3) AS some_condition -- Fake ... 
        FROM  b
  )
SELECT *
  FROM a1
  JOIN b USING (bid)
 WHERE EXISTS( SELECT * FROM z
        WHERE some_condition = 1 AND cid = b.cid )
UNION ALL
SELECT *
  FROM a2
  JOIN b USING (bid)
 WHERE EXISTS( SELECT * FROM z
        WHERE some_condition = 2 AND cid = b.cid )
        ;
Run Code Online (Sandbox Code Playgroud)

一个稍微不同的语法来做同样的事情:

WITH z AS (
  SELECT cid
        , (cid %3) AS some_condition 
        FROM  b
)
SELECT *
  FROM a1
  JOIN b ON a1.bid = b.bid
        AND EXISTS( SELECT * FROM z
        WHERE some_condition = 1 AND cid = b.cid )
UNION ALL
SELECT *
  FROM a2
  JOIN b ON a2.bid = b.bid
        AND EXISTS( SELECT * FROM z
        WHERE some_condition = 2 AND cid = b.cid )
        ;
Run Code Online (Sandbox Code Playgroud)