我希望能够从拥有外键作为主键的表中获取数据,仅使用WHERE
其他表中的子句中的数据。
我尝试过内部连接,但得到了奇怪的结果。我正在使用https://sqliteonline.com来测试这一点。
我有两张表,一张名为cars
“具有名称和 ID”的表。一个被调用的logged_data
具有 ID、轨道和汽车 ID 的外键,使用car.id
.
我想获取在特定赛道上记录数据的所有(不同的)汽车名称。
这些是我尝试过的陈述:
CREATE TABLE cars (id INTEGER PRIMARY KEY NOT NULL, name TEXT UNIQUE NOT NULL DEFAULT 'Car1');
INSERT INTO cars DEFAULT VALUES;
INSERT OR IGNORE INTO cars (name) VALUES ("BMW");
INSERT OR IGNORE INTO cars (name) VALUES ("test");
CREATE TABLE logged_data (id INTEGER PRIMARY KEY NOT NULL, track TEXT NOT NULL, car_id INTEGER NOT NULL, FOREIGN KEY(car_id) REFERENCES cars(id) ON DELETE CASCADE);
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "Car1"));
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "Car1"));
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "BMW"));
INSERT INTO logged_data (track, car_id) VALUES ("track", (SELECT id FROM cars WHERE name = "BMW"));
INSERT INTO logged_data (track, car_id) VALUES ("track1", (SELECT id FROM cars WHERE name = "test"));
INSERT INTO logged_data (track, car_id) VALUES ("track1", (SELECT id FROM cars WHERE name = "test"));
SELECT DISTINCT name FROM cars INNER JOIN logged_data ON logged_data.car_id = cars.id WHERE track = "track";
这将返回:
Car1
BMW
test
test
不应返回,因为它尚未在 处获取记录的数据track
。
我尝试选择所有内容来查看连接表的样子:
SELECT * FROM cars INNER JOIN logged_data ON logged_data.car_id = cars.id WHERE track = "track";
这只是返回所有曲目的所有数据,即使我只要求track
.
但奇怪的是,如果我得到的数据记录在不同的汽车名称中track1
。它正确地只返回test
. 这是我想要的正确方法吗?为什么我会看到这种不同的行为?
SELECT DISTINCT name FROM cars INNER JOIN logged_data ON logged_data.car_id = cars.id WHERE track = "track1";
这将返回:
test
秘密在双引号中:https://www.sqlite.org/lang_keywords.html
双引号中的字符串是标识符。它主要用于字段名称内部带有空格或类似内容的情况。
因此,通过拥有一个字段
track
并将track = "track"
字段track
与其自身进行比较。当您尝试执行此操作时
track = "track1"
- 没有对象,track1
因此它被理解为字符串文字。引用文档:问题的解决方案 - 对字符串文字使用单引号:
正如您所看到的,这是您的第一个使用正确的字符串语法的查询。