我必须进行选择查询才能创建具有特定条件的视图。
我有多个表,其中包含许多列和行。
但是,我提取了一个值用作我的键(例如:id)。我使用函数UNION从所有表中提取了7000多个唯一键,以避免重复。
现在,我想添加一列INDICATOR_1,它将根据条件影响值YES或NO。
这是我挣扎的地方。
我需要在那些包含ID的表中找到该行。之后,我想一直在那一行检查XYZ字段是否包含值“ N”(示例)。如果是,请影响INDICATOR_1的值为“是”,否则为否。
就伪代码而言,我想做的事情看起来像这样:
CASE
WHEN id = (id from table_1) AND (if table_1.xyz = 'N')
THEN 'YES'
ELSE 'NO'
END AS INDICATOR_1
我不清楚我是否足够清楚,但是您的帮助将不胜感激。
答案 0 :(得分:0)
如果我的理解正确,那么您希望每个表都有一个单独的指示器。像这样:
select i.*,
(case when exists (select 1
from table1 t1
where t1.id = i.id and t1.xyz = 'N'
)
then 'YES' else 'NO'
end) as indicator_1,
(case when exists (select 1
from table2 t2
where t2.id = i.id and t2.xyz = 'N'
)
then 'YES' else 'NO'
end) as indicator_2,
. . .
from (<your id list here>) i
答案 1 :(得分:0)
我认为您应该在联合中解决此问题,在联合中您拥有所有需要的数据。你可能有类似的东西:
SELECT Id
FROM table_1
UNION
SELECT Id
FROM table_2
如何也选择所需的信息(我在这里使用distinct
进行澄清):
SELECT DISTINCT Id
, CASE WHEN table_1.xyz = 'N' THEN 'N'
ELSE 'Y'
END INDICATOR_1
FROM table_1
如果id可以同时存在两种口味的记录,则这可能导致比您拥有的记录更多。我们可以在外部查询中使用行号来解决该问题。您最终会得到类似的东西:
SELECT Id
, INDICATOR_1
FROM (
SELECT Id
, INDICATOR_1
, ROW_NUMBER()OVER(PARTITION BY ID ORDER BY CASE WHEN INDICATOR_1 ='N' THEN 0 ELSE 1 END) RN
FROM (
SELECT Id
, CASE WHEN table_1.xyz = 'N' THEN 'N'
ELSE 'Y'
END INDICATOR_1
FROM table_1
UNION
...
) T
) S
WHERE S.RN = 1
您实际上可以通过在ROW_NUMBER表达式中使用最里面的case表达式来缩短它。