LEFT JOIN, но с дополнительными строками из родительской таблицы - PullRequest
2 голосов
/ 07 июля 2019

Не уверен, как это назвать, - я уверен, что это нужно спрашивать в другом месте.

Рассмотрим следующее, например.

CREATE TABLE abbrv (
    abbrv_id int unsigned primary key not null auto_increment,
    usps_primary varchar(64) not null,
    usps_preferred varchar(16) not null
);

CREATE TABLE abbrv_variation (
    variation_id int unsigned primary key not null auto_increment,
    abbrv_id int unsigned, -- FK
    variation varchar(64) not null
);

INSERT INTO abbrv(usps_primary, usps_preferred) VALUES('North', 'N');
INSERT INTO abbrv(usps_primary, usps_preferred) VALUES('South', 'S');
INSERT INTO abbrv(usps_primary, usps_preferred) VALUES('East', 'E');
INSERT INTO abbrv(usps_primary, usps_preferred) VALUES('West', 'W');

INSERT INTO `abbrv` (usps_primary, usps_preferred) values('ALLEY', 'ALY');
SET @abbrvId = LAST_INSERT_ID();
INSERT INTO `abbrv_variation` (abbrv_id, variation) VALUES(@abbrvId, 'ALLEE');
INSERT INTO `abbrv_variation` (abbrv_id, variation) VALUES(@abbrvId, 'ALLY');

INSERT INTO `abbrv` (usps_primary, usps_preferred) values('ANEX', 'ANX');
SET @abbrvId = LAST_INSERT_ID();
INSERT INTO `abbrv_variation` (abbrv_id, variation) VALUES(@abbrvId, 'ANNEX');
INSERT INTO `abbrv_variation` (abbrv_id, variation) VALUES(@abbrvId, 'ANNX');
INSERT INTO `abbrv_variation` (abbrv_id, variation) VALUES(@abbrvId, 'ANX');

Я просто пытаюсь вернуть что-то вроде:

+--------------+----------------+-----------+
| usps_primary | usps_preferred | variation |
+--------------+----------------+-----------+
| North        | N              | North     | <-- 1 row for "usps_primary"
| North        | N              | N         | <-- 1 row for "usps_preferred"
| South        | S              | South     | <-- 1 row for "usps_primary"
| South        | S              | S         | <-- 1 row for "usps_preferred"
| East         | E              | East      | <-- 1 row for "usps_primary"
| East         | E              | E         | <-- 1 row for "usps_preferred"
| West         | W              | West      | <-- 1 row for "usps_primary"
| West         | W              | W         | <-- 1 row for "usps_preferred"
| ALLEY        | ALY            | ALLEY     | <-- 1 row for "usps_primary"
| ALLEY        | ALY            | ALY       | <-- 1 row for "usps_preferred"
| ALLEY        | ALY            | ALLEE     | X-- one row for each 
| ALLEY        | ALY            | ALLY      | X-- variation    
| ANEX         | ANX            | ANEX      | <-- 1 row for "usps_primary"
| ANEX         | ANX            | ANX       | <-- 1 row for "usps_preferred"
| ANEX         | ANX            | ANNEX     | X-- one row for each 
| ANEX         | ANX            | ANNX      | X-- variation    

Порядок не имеет значения - просто они все там. Первоначально в этой таблице просто были строки «вариантов» для каждого из них, но она стала неуправляемой, так как это очень большая таблица, чтобы гарантировать, что все эти строки вводятся каждый раз, когда добавляется новый вариант.

Конечно, я пробовал ЛЕВОЕ СОЕДИНЕНИЕ, КРЕСТНОЕ СОЕДИНЕНИЕ, ВНЕШНЕЕ СОЕДИНЕНИЕ, соединение некоторых слева и справа - я действительно не знаю, каков здесь правильный ход действий.

Перекрестное соединение кажется примерно правильным, но я не хочу всю серию, просто 2 раза каждая.

Ответы [ 2 ]

1 голос
/ 07 июля 2019
SELECT usps_primary, usps_preferred, usps_primary AS variation FROM abbrv
UNION
SELECT usps_primary, usps_preferred, usps_preferred FROM abbrv
UNION
SELECT a.usps_primary, a.usps_preferred, v.variation FROM abbrv AS a 
INNER JOIN abbrv_variation AS v USING (abbrv_id)
ORDER BY usps_primary

Выход:

+--------------+----------------+-----------+
| usps_primary | usps_preferred | variation |
+--------------+----------------+-----------+
| ALLEY        | ALY            | ALLEY     |
| ALLEY        | ALY            | ALLEE     |
| ALLEY        | ALY            | ALLY      |
| ALLEY        | ALY            | ALY       |
| ANEX         | ANX            | ANX       |
| ANEX         | ANX            | ANNX      |
| ANEX         | ANX            | ANEX      |
| ANEX         | ANX            | ANNEX     |
| East         | E              | E         |
| East         | E              | East      |
| North        | N              | North     |
| North        | N              | N         |
| South        | S              | South     |
| South        | S              | S         |
| West         | W              | W         |
| West         | W              | West      |
+--------------+----------------+-----------+
0 голосов
/ 07 июля 2019

Вы можете использовать LATERAL:

SELECT usps_primary, usps_preferred, s.variation
FROM abbrv a
,LATERAL(SELECT a.usps_primary AS variation
         UNION SELECT a.usps_preferred 
         UNION SELECT av.variation FROM abbrv_variation av WHERE a.abbrv_id = av.abbrv_id) s

ДБ <> Fiddle demo

Выход:

+---------------+-----------------+-----------+
| usps_primary  | usps_preferred  | variation |
+---------------+-----------------+-----------+
| North         | N               | North     |
| North         | N               | N         |
| South         | S               | South     |
| South         | S               | S         |
| East          | E               | East      |
| East          | E               | E         |
| West          | W               | West      |
| West          | W               | W         |
| ALLEY         | ALY             | ALLEY     |
| ALLEY         | ALY             | ALY       |
| ALLEY         | ALY             | ALLEE     |
| ALLEY         | ALY             | ALLY      |
| ANEX          | ANX             | ANEX      |
| ANEX          | ANX             | ANX       |
| ANEX          | ANX             | ANNEX     |
| ANEX          | ANX             | ANNX      |
+---------------+-----------------+-----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...