将额外数据添加到表sql中不存在的视图中

时间:2017-11-23 13:14:14

标签: sql oracle outer-join

我正在尝试从与另一个表连接的表中返回一些数据。另外,除了表格中的内容之外,我还想要返回更多数据,但这些数据不应存储在数据库中。

这是我的人员表

+-------+-------------------+
| name  | preferred_fruit_id |
+-------+-------------------+
| john  |                 3 |
| smith |                 2 |
| sam   |                -1 |
+-------+-------------------+

和水果表

+------------+----------+
| fruit_name | fruit_id |
+------------+----------+
| apple      |        3 |
| orange     |        2 |
+------------+----------+

这是我对视图的查询

SELECT name, fruit_name
FROM person p,fruit f
WHERE p.preferred_fruit_id = f.fruit_id

我希望视图查询返回类似这样的内容,添加“all”,其中preferred_fruit_id为-1。

+-------+--------+
| name  | fruit  |
+-------+--------+
| john  | apple  |
| smith | orange |
| sam   | all    |
+-------+--------+

我怎样才能做到这一点?提前谢谢。

3 个答案:

答案 0 :(得分:0)

您似乎想要left join。如果您在from子句中使用逗号 never 的建议,这将更加明显:

SELECT name, COALESCE(fruit_name, 'all') as fruit_name
FROM person p LEFT JOIN
     fruit f
     ON p.preferred_fruit_id = f.fruit_id;

这假设person表中所有不匹配的水果都应该是all。如果您特别想要-1,请改用CASE表达式。

请注意,-1是"所有"的不良指标。要么包括"所有"在水果桌上。或者,使用NULL。这些方法允许您在两个表之间定义适当的外键约束。

答案 1 :(得分:0)

-1中的{p> person.preferred_fruit是一个神奇的值。它可能看起来像一个巧妙的技巧,但这样的东西将长期破坏你的数据库。迟早有人会把你的魔法价值误认为是真正的价值,这并不好。

更好的选择是使用null代替。

但是如果你想将实际意义归因于该值,那么将-1, 'all'放在fruit中并强制执行外键。

通过加入personfruit,您可以直接进行查找,在查询中无需显示正确的数据。

答案 2 :(得分:0)

试试这个..

with person as(
select 'john' as name,3 as preferred_fruit_id from dual union all
select 'smith' as name,2 as preferred_fruit_id from dual union all
select 'sam' as name,-1 as preferred_fruit_id from dual
),
fruit as(
select 'apple' as fruit_name,3 as fruit_id from dual union all
select 'orange' as fruit_name,2 as fruit_id from dual
),
fruit2 as(
select fruit_name,fruit_id from fruit
union all
select 'all',-1 from dual
)
SELECT name, fruit_name
FROM person p,fruit2 f
WHERE p.preferred_fruit_id = f.fruit_id

或者这个

with
fruit2 as(
    select fruit_name,fruit_id from fruit
    union all
    select 'all',-1 from dual
    )
    SELECT name, fruit_name
    FROM person p,fruit2 f
    WHERE p.preferred_fruit_id = f.fruit_id