Внутреннее объединение трех таблиц с вертикальными и горизонтальными ссылками - PullRequest
0 голосов
/ 09 января 2020

Я надеюсь, что заголовок правильно описывает мою проблему, простите, если я ошибаюсь.

Я хотел бы получить расстояние между двумя точками (в данном примере CN и US) на основе следующих трех таблиц :

Отгрузки

    |----------------------|-------------------|----------------|
    |         from         |        to         |    distance    |
    |----------------------|-------------------|----------------|
    |          CN          |        US         |                |
    |----------------------|-------------------|----------------|

Местоположения

    |----------------------|-------------------|
    |       location       |   location_id     |
    |----------------------|-------------------|
    |          CN          |        123        |
    |          US          |        456        |
    |----------------------|-------------------|

Расстояния

    |----------------------|-------------------|----------------|
    |   from_location_id   |   to_location_id  |    distance    |
    |----------------------|-------------------|----------------|
    |         123          |       456         |      789       |
    |----------------------|-------------------|----------------|

Вот что у меня есть:

    UPDATE Shipments SHP
    INNER JOIN Locations LOC1 ON SHP.from = LOC1.location
    INNER JOIN Distances DST1 ON LOC1.location_id = DST1.from_location_id

    INNER JOIN Locations LOC2 ON SHP.to =  LOC2.location
    INNER JOIN Distances DST2 ON LOC2.location_id = DST2.to_location_id
    SET SHP.distance = DST2.distance;

У меня проблемы с установкой правильного псевдонима, чтобы обеспечить вертикальное внутреннее соединение. Также я не уверен, как использовать псевдоним в предложении SET в конце. Я пытался использовать DST2, но это дает ложные результаты. Заранее спасибо за любую помощь!

Ответы [ 2 ]

1 голос
/ 09 января 2020

Вы можете попытаться использовать приведенный ниже код обновления, самостоятельно присоединиться дважды на Locations, а затем обновить.

UPDATE Shipments SHP 
INNER JOIN Locations LOC1 ON SHP.`from` = LOC1.location 
INNER JOIN Distances DST1 ON LOC1.location_id = DST1.from_location_id
INNER JOIN Locations LOC2 ON LOC2.location_id = DST1.to_location_id AND SHP.`to` = LOC2.location
SET SHP.distance = DST1.distance

Запрос 1 :

SELECT *
FROM Shipments

Результаты :

| from | to | distance |
|------|----|----------|
|   CN | US |      789 |
0 голосов
/ 09 января 2020

Рассмотрим следующее:

DROP TABLE IF EXISTS locations;

CREATE TABLE locations
(location_id SERIAL PRIMARY KEY
,location CHAR(2) UNIQUE
);

INSERT INTO locations VALUES
(123,'CN'),
(456,'US');

DROP TABLE IF EXISTS distances;

CREATE TABLE distances
(from_location_id INT NOT NULL
,to_location_id INT NOT NULL
,distance INT NOT NULL
,PRIMARY KEY(from_location_id,to_location_id)
);

INSERT INTO distances VALUES
(123,456,789);

SELECT a.location `from`
     , b.location `to`
     , x.distance 
  FROM distances x 
  JOIN locations a  
    ON a.location_id = x.from_location_id 
  JOIN locations b  
    ON b.location_id = x.to_location_id;
+------+------+----------+
| from | to   | distance |
+------+------+----------+
| CN   | US   |      789 |
+------+------+----------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...