java - 从一个表中选择仅通过两个一对多表连接到另一个表中的一个值的值

标签 java sqlite

作为表结构的示例:

CREATE TABLE group (group_id int primary key, group_name string unique)
CREATE TABLE gitems (gitem_id int primary key, ...)
CREATE TABLE group_gitem (group_id int foreign key, gitem_id int foreign key)
CREATE TABLE object_gitem (gitem_id int foreign key, object_id string foreign key)
CREATE TABLE object (object_id string primary key, ...)

我想选择出现在一个特定组中的所有 object_ids,但不选择出现在多个组中的 object_ids。我已经尝试了以下查询,但它没有按照我希望的方式执行,并且实际上没有返回任何内容。

SELECT object_id, COUNT(group_id) AS link_count FROM group 
LEFT JOIN group_gitem ON group_gitem.group_id = group.group_id 
LEFT JOIN object_gitem ON object_gitem.gitem_id = group_gitem.gitem_id 
GROUP BY object_id 
HAVING link_count <= 1 AND group_id = 0

我计划使用 object_ids 删除磁盘上各自的 jpg 图像,例如 aBjf9k4d9l.jpg 将链接到 object_id 值 aBjf9k4d9l。然后,我计划删除该组和所有相关项目,同时保留仍链接到另一组的对象,即使它存在于我计划从数据库中删除的组中。

最佳答案

使用集合操作通常比连接更简单:

WITH og AS (
  SELECT object_id,
         group_id
  FROM object_gitem
  JOIN group_gitem USING (gitem_id)
)
SELECT object_id
FROM object
WHERE object_id     IN (SELECT object_id
                        FROM og
                        WHERE group_id =  0)
  AND object_id NOT IN (SELECT object_id
                        FROM og
                        WHERE group_id <> 0);

关于java - 从一个表中选择仅通过两个一对多表连接到另一个表中的一个值的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41417753/

相关文章:

java - 使用 java 和 Tika 的正则表达式将字符串拆分为数组

java - JAX-RS 的注释继承不起作用

java - sqlitejdbc在哪里下载?

Java 代码,安全

java - 如何循环ArrayList并将每个值发送到下载管理器?

Android sqlite `db.execSQL()` 强制关闭

django - sqlite 数据库表在测试时被锁定

sqlite - 插入或替换不起作用

r - 列出数据库中的所有表

java - 编译错误: variable may not have been initialized