在使用带有连接的case语句时遇到问题。
我有两个桌子。 Tbl_a:
和Tbl_b:
我正在运行以下查询:
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'的值,依此类推。但是当我运行查询时,我得到了所有可能的匹配项:
我了解为什么会得到这些结果,但是我不知道如何获得想要的结果。 任何帮助将不胜感激,谢谢!
答案 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;