SQL Chaining加入

时间:2018-05-22 06:12:47

标签: mysql join

编辑:问题是数据不匹配表A_B和B_C中的B-ID没有重叠

我有以下表格:

  • A(id,...)
  • A_B(a_id,b_id)
  • B_C(b_id,c_id)
  • C_D(c_id,d_id)
  • D(id,value,...)

我希望根据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

这只是一张空桌。

我开始认为我正在以错误的方式处理这个问题,或者可能误解了应该如何加入表格。

1 个答案:

答案 0 :(得分:0)

如果您的数据一致,那么您的工作正常。这是您的数据库和查询的一个版本,用于演示这一点。为简单起见,我推断了表bc的存在,并使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>