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

Database 使用布尔逻辑创建数据库视图,database,sqlite,view,boolean,Database,Sqlite,View,Boolean,我的谷歌搜索技能让我失望,我也不是一个数据库专家!我有一个非常简单的数据库模式,如下所示: CANDY表中的properties\u id是昂贵的\u properties表中id的外键。仅当糖果价格昂贵时才设置属性id。如果是昂贵的,那么将填写昂贵的属性表中的相应值 当我想得到一份糖果清单时,我基本上想这样做: 请求CANDY表中的所有属性,如名称和颜色 如果properties\u id值不为null,可以选择获取昂贵的属性 在过去,我做过两次查询,但这是愚蠢的,因为我应该能够创建一个视图,

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

CANDY表中的properties\u id是昂贵的\u properties表中id的外键。仅当糖果价格昂贵时才设置属性id。如果是昂贵的,那么将填写昂贵的属性表中的相应值

当我想得到一份糖果清单时,我基本上想这样做:

请求CANDY表中的所有属性,如名称和颜色 如果properties\u id值不为null,可以选择获取昂贵的属性 在过去,我做过两次查询,但这是愚蠢的,因为我应该能够创建一个视图,将所有属性聚合到一个表中,如果在属性表中没有相应的id,则只将其他字段留空

有人能告诉我如何在SQLite中创建这个视图吗?我认为这是可能的,但无法理解:

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

更新

这个问题已经得到了回答,但我觉得奇怪的是,在某些情况下,我会看到重复的条目。我使用的是SQLite Administrator,当我执行CREATEVIEW语句并查看结果选项卡时,会得到唯一的条目。如果我只执行SELECT语句,就会得到重复的行。如果我创建视图,然后从myview中选择*;我还看到重复的行。有人能解释一下吗?我应该提出一个新问题吗

更新2

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

您可以使用从另一个表检索数据,该表可能没有主表中某些行的数据

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不指处理不存在的数据。相反,这意味着如果视图不存在,它将创建该视图。这是为了防止在多次运行语句时出错。

我不熟悉SQLite,但在其他情况下,将需要左外联接:

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

这将选择任何匹配项,并为ep.*保留空值,而CANDY表中不存在空值。

您希望在视图中执行左联接。这将从联接中的第一个表以及匹配的第二个表返回所有内容。如果没有与糖果不昂贵匹配的内容,则第二个表中的字段将为空


选择*from candy left outer在candy.id=昂贵的属性上加入昂贵的属性。id

好的,我现在就去试试。谢谢我以前没有使用过外部联接。还有一个问题-虽然这样做有效,但为什么只使用SELECT语句而不创建视图会导致结果中出现重复行?如果在具有相同ep.id的属性中有多行,或者在Candy中有重复行,则会得到重复行。无论是对表运行select语句,还是从视图中执行select,都会得到相同的结果。谢谢,事实证明,在我的from子句中,我指定了两个表。我删除了ep,现在它可以正常工作了。