SQLite JOIN WHERE 不在多个表中

标签 sql sqlite medoo

我使用 sqlite 并具有以下架构和表数据

"CREATE TABLE numbers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,   
    cli INTEGER UNIQUE
);"

"CREATE TABLE allocated (
    did_id INTEGER,
    cli INTEGER UNIQUE,
    client_id INTEGER
);"

"CREATE TABLE used (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    cli INTEGER DEFAULT 0 NOT NULL,
    client_id INTEGER,
    date DATETIME
);"

示例数据

table `numbers`
id  cli
11  444
12  555
13  666
14  777
15  888
16  999

table `allocated`
did_id  cli
14  777
12  555

table `used`
id  cli
31  111
31  222
32  444
33  999

我想从numbers表中获取列数据“cli”,其中“cli”不在表分配或表使用中。

预期结果

numbers
id cli 
13 666
15 888

首先我想知道 sqlite 查询是什么。 如果可能的话我想将它与 Medoo php 库一起应用。

最佳答案

一个选项是双重反连接:

SELECT n.id, n.cli
FROM numbers n
LEFT JOIN allocated a
    ON n.cli = a.cli
LEFT JOIN used u
    ON n.cli = u.cli
WHERE
    a.cli IS NULL AND u.cli IS NULL;

我们还可以在这里使用EXISTS:

SELECT n.id, n.cli
FROM numbers n
WHERE
    NOT EXISTS (SELECT 1 FROM allocated a WHERE a.cli = n.cli) AND
    NOT EXISTS (SELECT 1 FROM used u WHERE u.cli = n.cli);

关于SQLite JOIN WHERE 不在多个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53861363/

相关文章:

mysql - 所有列不为空的 SQL 语句

php - Medoo,简短的 ajax 语法

php - 使用返回 false 而不是数据的 medoo 表连接

php - php 类中的 Medoo 对象

MySQL DELETE FROM 以子查询为条件

mysql - 对于这种格式的数据,MySQL 中必须有什么类型的列?

MYSQL 带范围的多重复合索引

java - 数据库版本 SQLite Android

java - 如何在 Android 上对 SQLite 的结果进行排序?

python - MySQL 客户端、Django