【问题标题】:Creating a database view with boolean logic使用布尔逻辑创建数据库视图
【发布时间】:2010-04-14 15:14:21
【问题描述】:

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

database schema http://bit.ly/adeUVL

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

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

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

过去,我做过两个查询,但这很愚蠢,因为我应该能够创建一个视图,将所有属性聚合到一个表中,如果没有对应的字段,则将其他字段留空EXPENSIVE_PROPERTIES 表中的 ID。

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

IF NOT EXISTS 元素似乎与特定字段值的存在没有任何关系。

更新

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

更新 #2

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

【问题讨论】:

    标签: database sqlite view boolean


    【解决方案1】:

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

    【讨论】:

    • 好的,我现在要试试。谢谢!我以前没用过外连接。
    • 还有一个问题——虽然这可行,但为什么只使用 SELECT 语句(不创建视图)会导致结果中出现重复行?
    • 如果Expensive_Properties 中有不止一行具有相同的ep.id,或者Candy 中有重复的行,您将得到重复。无论您对表运行 select 语句还是从视图中选择,都将获得相同的结果。
    • 谢谢,事实证明在我的 FROM 子句中我指定了两个表。我删除了 ep,现在它可以按预期工作了。
    【解决方案2】:

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

    select * from candy left outer join candy.id上的expensive_properties=expensive_properties.id

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-01-31
        • 2015-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        相关资源
        最近更新 更多