微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQLite 中的子选择

如何解决SQLite 中的子选择

问题

我最近完成了一项技术测试,这要求我执行一个相当复杂的sql 查询,我想在收到任何反馈之前知道答案是否符合我的要求给的是正确的,以及如何改进。

这是我对问题的释义

假设我们有一个销售帽子的网站,我们想为其建立一个数据库。每种类型的帽子都有尺寸、价格等。每种类型的帽子也可以归为无、一个或多个类别,这些类别本身可以是公开的或私人的。

执行以下操作:

  1. 编写伪 sql 代码,创建对上述模型进行建模所需的表。
  2. 编写一个查询,返回属于至少 5 个公共类别的帽子类型的记录。

我的尝试

由于我的大部分经验是使用 sqlite,所以我从 sqlite 的角度解决了这个问题,并在我的回答的评论中写了这个。

关于上面的第 (1) 点,我创建了三个表:HatCategoryBelongsToCategory,最后一个是前两个的连接表。我将 public 设为 Category 表的列,类型为 INTEGER:0 表示假,1 表示真。

至于第 (2) 点,这是我的查询

SELECT *
FROM Hat
WHERE
    (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = 1))
    >= 5

测试我的尝试

我以下列方式测试了我的尝试:

  • 我制作了自己的 .db 文件
  • 我使用sqlite 数据库浏览器打开了上述文件
  • 我创建了我的表格,如上所述。
  • 我向这些表中添加了数据,如下所示:
    • 我向 Hat添加了三个新记录:hat1、hat2 和 hat3。
    • 我向 Category添加了六个新记录:cat1 到 cat6,其中 cat1 到 cat5 是公共的,而 cat6 是私有的。
    • 我在 BelongsToCategory 表中添加了记录,这样 hat1 属于类别 cat1 到 cat5,hat2 只属于 cat1,hat3 属于类别 cat1 到 cat4,也属于 cat6。
  • 我运行了上面的 sql 代码

当我运行上面的 sql 代码时,它返回了 hat1 的记录。任务完成!没那么快...当我尝试稍微玩弄它时,将 5 更改为 4,或 3、2 等,我一直获得 hat1 的记录,仅此而已。直到我到达 1 时,hat3 才开始弹出,而我从未见过 hat2。

这是怎么回事? 我的查询有问题吗?或者这是 sqlite 浏览器中的错误

我想知道的

  • 上面的 sql 查询是否正确?
  • 如何改进?

解决方法

我不认为您的查询有任何问题(我已经对其进行了测试并且它按预期工作)。因此,我相信您可能没有按预期插入数据。

如果您将计数子查询作为附加列添加到主查询并使用 >= 0,您可以查看计数并了解计数的情况

例如:-

SELECT *,(SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true)) AS cat_count
FROM Hat
WHERE
    (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true))
    >= 0
;

以下用于测试上述内容:-

PRAGMA foreign_keys = ON;
DROP TABLE IF EXISTS BelongsToCategory;
DROP TABLE IF EXISTS Hat;
DROP TABLE IF EXISTS Category;
CREATE TABLE IF NOT EXISTS Hat (code INTEGER PRIMARY KEY,hattype TEXT,hatprice REAL,hatsize REAL,hatetc TEXT);
CREATE TABLE IF NOT EXISTS Category (code INTEGER PRIMARY KEY,category TEXT,public INTEGER);
CREATE TABLE IF NOT EXISTS BelongsToCategory (
    hat INTEGER REFERENCES Hat(code) ON DELETE CASCADE ON UPDATE CASCADE,category INTEGER REFERENCES Category(code) ON DELETE CASCADE ON UPDATE CASCADE,PRIMARY KEY(hat,category)
    )   
;

INSERT INTO Category VALUES(1,'cat1',true),(2,'cat2',(3,'cat3',(4,'cat4',(5,'cat5',(6,'cat6',false);
INSERT INTO Hat VALUES(1,'hat1',100,7,'other'),'hat2',90,6,'hat3',95,5,'hat4',110,8,'hat5',120,'other');
INSERT INTO BelongsToCategory VALUES
    (1,1),(1,2),3),4),5),6),1)
;

SELECT *,(SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true)) AS cat_count
FROM Hat
WHERE
    (SELECT COUNT(*)
     FROM BelongsToCategory
         JOIN Category ON Category.code = BelongsToCategory.category
         WHERE (BelongsToCategory.hat = Hat.code) AND (Category.public = true))
    >= 0
;

上面的结果(使用>=0):-

enter image description here

(使用 >=5):-

enter image description here

(使用 >=4):-

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?