Как выполнить естественное полное внешнее соединение в таблице с несколькими общими атрибутами?

mysql› выберите * из r;

+------+------+------+
| A    | B    | C    |
| 1    | 2    | 3    |
| 1    | 2    | 4    |
| 2    | 1    | 3    |
| 3    | 1    | 3    |
+------+------+------+

mysql› выберите * из s;

+------+------+------+
| A    | B    | D    |
| 1    | 2    | 1    |
| 2    | 1    | 5    |
| 4    | 2    | 1    |
| 3    | 2    | 1    |
+------+------+------+

Теперь я хочу выполнить естественное полное внешнее соединение. Я пробовал левое внешнее соединение, правое внешнее соединение и полное внешнее соединение, но они работают, хотя имеют только 1 общий элемент.

Но как это будет сделано здесь.

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


person Reason Behind Tech    schedule 15.06.2021    source источник
comment
Предоставьте образцы данных как CREATE TABLE + INSERT INTO. Обеспечьте желаемый результат /   -  person Akina    schedule 15.06.2021
comment
Я думаю, что естественное полное внешнее соединение - это не вещь: «естественное соединение» не может быть «внешним» / «внешнее» соединение не может быть «естественным». Укажите ожидаемый результат для вашего образца r natural_full_outer_join s. Также укажите запрос и результат испробованного вами полного внешнего соединения и объясните, что вы считаете неправильным. (Я вижу ответ @Gordon; я понятия не имею, дает ли он то, что вы ожидаете. Как он говорит, столбцы с нулевым значением в r, s делают это намного сложнее.)   -  person AntC    schedule 17.06.2021


Ответы (1)


Вы можете связать левые соединения, чтобы реализовать очень хорошее приближение к full join:

select *
from (select a, b from r
      union -- on purpose to remove duplicates
      select a, b from s
     ) rs left join
     r
     using (a, b) left join
     s
     using (a, b);

Это становится сложнее, если a/b может иметь значения NULL в r или s. Если это так, задайте новый вопрос с соответствующими образцами данных и желаемыми результатами.

person Gordon Linoff    schedule 15.06.2021
comment
Что касается удаления дубликатов, почему бы не просто select distinct * ... на внешнем уровне? - person AntC; 17.06.2021
comment
@АнтК. . . Логика другая. full join может фактически создавать дубликаты, и эта логика также будет создавать дубликаты. select distinct во внешнем запросе удалит дубликаты, поэтому он не эквивалентен full join. - person Gordon Linoff; 17.06.2021
comment
Эмм, ты парень, который думает, что «Natural Join — это катастрофа, ожидающая своего часа». IIRC. И теперь вы на самом деле хотите ввести дубликаты. Разве дубликаты не являются гораздо худшей катастрофой, ожидающей своего часа? - person AntC; 18.06.2021
comment
@АнтК. . . Это не отвечает на вопрос правильно. Вопрос заключается в реализации эквивалента естественного соединения. ОП может задать новый вопрос с другой логикой. - person Gordon Linoff; 18.06.2021