使用布尔逻辑创建数据库视图

时间:2010-04-14 15:14:21

标签: database sqlite view boolean

我的谷歌搜索技能让我失望了,我无论如何都不是数据库专家!我有一个非常简单的数据库模式,如下所示:

database schema http://bit.ly/adeUVL

CANDY表中的properties_id是EXPENSIVE_PROPERTIES表中id的外键。如果糖果很贵,则properties_id仅设置为。如果它很昂贵,那么将填写EXPENSIVE_PROPERTIES表中的相应值。

当我想获得糖果列表时,我基本上想要这样做:

  • 请求CANDY表中的所有属性,例如名称和颜色
  • 如果properties_id值不为null,则可选择获取昂贵的属性

过去,我已经完成了两个查询,但这很愚蠢,因为我应该能够创建一个将所有属性聚合到一个表中的视图,如果没有相应的话,只需将其他字段留空在EXPENSIVE_PROPERTIES表中的id。

有谁能告诉我如何在SQLite中创建这个视图?我认为这是可能的,但无法弄明白from the docs

alt text

IF NOT EXISTS元素似乎与特定字段值的存在无关。

更新

这个问题已得到解答,但有一件事我觉得很奇怪,在某些情况下,我看到重复的条目。我正在使用SQLite Administrator,当我执行CREATE VIEW语句并查看结果选项卡时,我会得到唯一的条目。如果我只是做一个SELECT语句,我会得到重复的行。如果我创建视图,然后执行SELECT * FROM myview;我也看到重复的行。任何人都可以对此有所了解吗?我应该创建一个新问题吗?

更新#2

没关系,我发现了我的错误 - 我在FROM之后有两个表,导致重复。

3 个答案:

答案 0 :(得分:3)

您可以使用LEFT OUTER JOIN从另一个表中检索可能没有主表中某些行数据的数据。

create view vCandy as
select c.id, c.name, c.color, c.properties,
 ep.chocolate, ep.gold_foil
from Candy c
left outer join Expensive_Properties ep on c.properties_id = ep.id

IF NOT EXISTS并不是指处理不存在的数据。相反,它意味着如果视图已经不存在,它将创建视图。这是为了防止多次运行语句时出错。

答案 1 :(得分:2)

您想在视图中执行左连接。这将从连接中的第一个表和匹配的第二个表中的所有内容返回所有内容。如果没有匹配(糖果不贵),第二个表中的字段将为空。

在candy.id = expensive_properties.id上选择* from candy left outer join expensive_properties

答案 2 :(得分:1)

我不熟悉SQLite,但是否则需要LEFT OUTER JOIN:

SELECT * FROM candy c
    LEFT OUTER JOIN expensive_properties ep ON c.id = ep.id
WHERE [your criteria]

这将选择匹配的任何内容,并且将为CANDY表不存在的ep。*留下NULL。