案例通过联接返回多个值

时间:2018-07-16 07:43:44

标签: sql join case amazon-redshift

在使用带有连接的case语句时遇到问题。

我有两个桌子。 Tbl_a:

enter image description here

和Tbl_b:

enter image description here

我正在运行以下查询:

SELECT
    tbl_a.id,
    (
        CASE
           WHEN tbl_b.param_type = 'Ignition' Then param_value
           WHEN tbl_b.param_type = 'Turn' Then param_value
           WHEN tbl_b.param_type = 'Speed' Then param_value
           WHEN tbl_b.param_type = 'Break' Then param_value 
        END 
    ) as value
FROM 
    public.tbl_a 
    JOIN public.tbl_b on tbl_b.id = tbl_a.id

我想为tbl_a中的每个id从tbl_b获得第一个匹配项。如果在tbl_b中有一个id为他的参数类型是'Ignition',那么我想获取他的值。如果没有,那么我想获取参数类型'Turn'的值,依此类推。但是当我运行查询时,我得到了所有可能的匹配项:

enter image description here

我了解为什么会得到这些结果,但是我不知道如何获得想要的结果。 任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以GROUP并拉出第一项...

SELECT 
    id, 
    FIRST(value) 
FROM 
    public.tbl_a AS a 
    INNER JOIN 
    public.tbl_b AS b 
        ON  a.id = b.id 
GROUP BY 
    a.id 

但是,这里的问题是,除非有某种类型的排序机制(例如时间或增量ID),否则无法保证您的值将始终保持正确的顺序。

注意:

我已经为标准的T-SQL编写了此代码,因此,如果Amazon RedShift不太遵循该标准,则可能需要查找语法。

答案 1 :(得分:0)

我认为这种方法可以满足您的需求

SELECT a.id,
       COALESCE( MAX(CASE WHEN b.param_type = 'Ignition' THEN a.param_value END), 
                 MAX(CASE WHEN b.param_type = 'Turn' THEN a.param_value END),
                 MAX(CASE WHEN b.param_type = 'Speed' THEN a.param_value END),
                 MAX(CASE WHEN b.param_type = 'Break' THEN a.param_value END)
               ) as value
FROM public.tbl_a a JOIN
     public.tbl_b
     ON b.id = a.id
GROUP BY a.id;