SQL Chaining присоединяется - PullRequest
0 голосов
/ 22 мая 2018

РЕДАКТИРОВАТЬ: проблема не совпадала с данными, B-идентификаторы в таблицах A_B и B_C не перекрывались

У меня есть следующие таблицы:

  • A(id,…)
  • A_B (a_id, b_id)
  • B_C (b_id, c_id)
  • C_D (c_id, d_id)
  • D (id, значение,…)

Где я хочу, чтобы некоторые строки из A основывались на значении строки в D. Таблицы A_B, B_C и C_D являются просто отображениями идентификаторов из одной таблицы в другую.

Я пытался найти что-то, что могло бы выглядеть примерно так:

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 голосов
/ 22 мая 2018

То, что у вас есть, работает нормально, если ваши данные согласованы.Вот версия вашей базы данных и запрос, который демонстрирует это.Для простоты я сделал вывод о существовании таблиц 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

Таким образом, если данные верны, построенный вами запрос может дать ответ.Однако, если вы получили пустую таблицу по вашему неполному запросу, то в ваших таблицах есть проблема с данными - или (не случайно) ваша схема схемы ввела нас в заблуждение.

Тестирование выполнено наMac под управлением MacOS High Sierra 10.13.4, использующий Informix 12.10.FC6, но использующий то, что считается подмножеством SQL, общим для Informix и MySQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...