SQL比较条件列选择要JOIN的表

时间:2016-03-11 15:27:23

标签: sql postgresql case

一般表:

| id | name | type_id |

SECONDARY1 表格:

| id | general_id | erynda_kakayato | byaka |

SECONDARY2 表:

| id | general_id | konkretnaya_hren |

如何使用列的值将GENERAL表和其中一个SECONDARY组合到GENERAL.TYPE_ID? 以下查询不起作用,但逻辑​​应该是这样的。

SELECT * 
FROM GENERAL  
   JOIN (CASE WHEN types_id = 1 THEN  'SECONDARY1' 
              WHEN types_id = 2 THEN  'SECONDARY2' END) AS t  
      ON GENERAL.id = t.id

此请求是必需的,因为连接的类型更改表的值。使用相同的表是不可能的,因为不同表中的属性和列数取决于列类型GENERAL。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT g.* 
FROM GENERAL AS g
LEFT JOIN SECONDARY1 AS s1 
   ON CASE WHEN g.type_id = 1 THEN g.id END = s1.general_id
LEFT JOIN SECONDARY2 AS s2
   ON CASE WHEN g.type_id = 2 THEN g.id END = s2.general_id

如果type_id = 1,则只执行第一个LEFT JOIN操作,因为第二个ON的{​​{1}}子句变为LEFT JOIN,可以永远不会评估为NULL = s2.general_id

答案 1 :(得分:1)

您需要在select中选择值。如果使用left join,您可以选择第一个非NULL值:

select g.*, coalesce(s1.erynda_kakayato, konkretnaya_hren)
from general g left join
     secondary1 s1 
     on s1.general_id = g.id and g.type_id = 1 left join
     secondary s2
     on s2.general_id = g.id and g.type_id = 2 ;