通过join获取查询结果

时间:2017-05-17 03:38:40

标签: sql postgresql

如果事件表中有条目,我试图使用以下查询获取两个事件。

SELECT * FROM (
    SELECT 
        e.* 
    FROM 
        events e
    WHERE 
        e.id= 654321
        AND e.sub_type_id = 78
        AND e.type_id = 230
        AND e.cid = 123
    UNION ALL
    SELECT 
        e1.* 
    FROM 
        events e1
    WHERE 
        e1.id< 654321
        AND e1.sub_type_id = 78
        AND e1.type_id = 230
        AND e1.cid = 123
) as sub
ORDER BY id DESC 
LIMIT 2;

此查询适用于第二个事件输入等等,因为我得到两个记录但是对于第一个事件,我想要problem_description所以我修改了查询,如下所示 -

SELECT * FROM (
    SELECT 
        e.*,
        rd.problem_description
    FROM 
        events e
        JOIN request_details rd ON( rd.cid = e.cid AND rd.request_id = e.data_reference_id)
    WHERE 
        e.id= 654321
        AND e.sub_type_id = 78
        AND e.type_id = 230
        AND e.cid = 123
    UNION ALL
    SELECT 
        e1.*,
        rd1.problem_description     
    FROM 
        events e1
        JOIN request_details rd1 ON( rd1.cid = e1.cid AND rd1.request_id = e1.data_reference_id)
    WHERE 
        e1.id< 654321
        AND e1.sub_type_id = 78
        AND e1.type_id = 230
        AND e1.cid = 123
) as sub
ORDER BY id DESC 
LIMIT 2;

我对应该使用哪种类型的连接感到困惑,因为对于第一个条目,数据库中没有任何记录事件,但是有一个记录为problem_description。

1 个答案:

答案 0 :(得分:0)

如果您可以使用UNION ALL,那么e1.data_reference_id <= 654321似乎毫无用处。

另外,如果记录总是存在于右表request_details中,有时甚至存在于事件表中,我认为你所需要的只是一个正确的联接。

select e.*,
    r.problem_description
from events e
right join request_details r on e.cid = e.cid
    and r.request_id = e.data_reference_id
where e.data_reference_id <= 654321
    and e.sub_type_id = 78
    and e.type_id = 230
    and e.cid = 123
order by e.id desc limit 2;