编辑:问题是数据不匹配表A_B和B_C中的B-ID没有重叠
我有以下表格:
我希望根据D中行的值从A中获取一些行。 表A_B,B_C和C_D只是从一个表到另一个表的id映射。
我试图找到类似这样的东西:
select * from A where D.value = "true"
我到目前为止:
select * from A
inner join A_B on A_B.a_id = A.id
inner join B_C on B_C.b_id = A_B.b_id
这只是一张空桌。
我开始认为我正在以错误的方式处理这个问题,或者可能误解了应该如何加入表格。
答案 0 :(得分:0)
如果您的数据一致,那么您的工作正常。这是您的数据库和查询的一个版本,用于演示这一点。为简单起见,我推断了表b
和c
的存在,并使X_Y
样式表中的各列成为单字母表的外键。
CREATE TABLE a
(
id INTEGER NOT NULL PRIMARY KEY,
info VARCHAR(20) NOT NULL
);
CREATE TABLE b
(
id INTEGER NOT NULL PRIMARY KEY,
data VARCHAR(20) NOT NULL
);
CREATE TABLE C
(
id INTEGER NOT NULL PRIMARY KEY,
extra VARCHAR(20) NOT NULL
);
CREATE TABLE d
(
id INTEGER NOT NULL PRIMARY KEY,
value VARCHAR(20) NOT NULL
);
CREATE TABLE a_b
(
a_id INTEGER NOT NULL REFERENCES a,
b_id INTEGER NOT NULL REFERENCES b,
PRIMARY KEY (a_id, b_id)
);
CREATE TABLE b_c
(
b_id INTEGER NOT NULL REFERENCES b,
c_id INTEGER NOT NULL REFERENCES C,
PRIMARY KEY(b_id, c_id)
);
CREATE TABLE c_d
(
c_id INTEGER NOT NULL REFERENCES C,
d_id INTEGER NOT NULL REFERENCES d,
PRIMARY KEY(c_id, d_id)
);
INSERT INTO a VALUES(1, "Quasimodo");
INSERT INTO b VALUES(20, "Quiet");
INSERT INTO C VALUES(333, "Contemporaneous");
INSERT INTO d VALUES(4444, "true");
INSERT INTO a_b VALUES(1, 20);
INSERT INTO b_c VALUES(20, 333);
INSERT INTO c_d VALUES(333, 4444);
SELECT *
FROM a
JOIN a_b ON a_b.a_id = a.id
JOIN b_c ON b_c.b_id = a_b.b_id
JOIN c_d ON c_d.c_id = b_c.c_id
JOIN d ON d.id = c_d.d_id
WHERE d.value = "true";
对于给定的数据,产生:
1 Quasimodo 1 20 20 333 333 4444 4444 true
因此,如果数据正确,您构建的查询可以产生答案。但是,如果您在不完整的查询中获得一个空表,那么表中存在数据问题 - 或者(外部机会)您的大纲架构误导了我们。
使用Informix 12.10.FC6在运行macOS High Sierra 10.13.4的Mac上进行测试,但使用的是Informix和MySQL常用的SQL子集。 < / SUP>