我正在尝试从与另一个表连接的表中返回一些数据。另外,除了表格中的内容之外,我还想要返回更多数据,但这些数据不应存储在数据库中。
这是我的人员表
+-------+-------------------+ | 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 | +-------+--------+
我怎样才能做到这一点?提前谢谢。
答案 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
中并强制执行外键。
通过加入person
和fruit
,您可以直接进行查找,在查询中无需显示正确的数据。
答案 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