Как объединить две таблицы без общего ключа?
Имею 1 таблицу ‘ta’ в которой столбцы: abonent и direction И 2 таблицу ‘city_code’ в которой столбцы: city и code
Как объединить две таблицы по столбцам direction и code? Ведь общего ключа нет, а надо написать что направление звонка — это Москва итд.
Отслеживать
задан 23 апр в 12:04
1 1 1 бронзовый знак
добро пожаловать на Stack Overflow на русском! как задавать хорошие вопросы про sql?
23 апр в 12:06
Либо добавьте ключи в существующую таблицу, либо создайте третью таблицу-связку и через нее соединяйте.
23 апр в 12:35
Их нельзя никак объединить, если не расписать четкие правила как direction должен превращаться в code. А вот если правила будут, тогда можно брать строковые функции mysql и преобразовывать одно в другое, согласно этим правилам
23 апр в 12:37
Готов добавить ключи или третью таблицу. Что угодно. У самого идей нет по этому поводу, буду рад подсказкам.
23 апр в 12:50
Так вам же ж уже подсказали. Осталось только выбрать подходящее вам решение и реализовать. Соответствие, скорее всего придется делать вручную. Иногда вообще бывает полезным пересмотреть архитектуру данных в БД, все грохнуть и заново заполнить 🙂
SQL — LEFT JOIN
От автора: LEFT JOIN SQL возвращает все строки из левой таблицы, даже если в правой таблице нет совпадений. Это означает, что, если условие ON соответствует 0 (нолю) записей в правой таблице; объединение все равно вернет строку в результат, но с NULL в каждом столбце из правой таблицы.
Это означает, что LEFT JOIN возвращает все значения из левой таблицы, а также соответствующие значения из правой таблицы или NULL в случае отсутствия соответствующего предиката объединения.
Синтаксис
Основной синтаксис LEFT JOIN следующий.
JOIN

Выбираются только те записи, которые совпадают в обоих таблицах.
LEFT OUTER JOIN

SELECT * FROM tableA LEFT OUTER JOIN tableB ON tableA.name = tableB.name
id name id name
-- ---- -- ----
1 Яблоко 2 Яблоко
2 Ананас null null
3 Банан 4 Банан
4 Груша null null
Все записи из таблицы А и совпавшие записи из таблицы B. Если совпадение отсутствует, то правая сторона будет содержать значение null, т.к. управляющая таблица левая, об этом говорит ключевое слово LEFT.
LEFT OUTER JOIN WHERE B id IS NULL

SELECT * FROM tableA LEFT OUTER JOIN tableB ON tableA.name = tableB.name
WHERE tableB.id IS null
id name id name
-- ---- -- ----
2 Ананас null null
4 Груша null null
Уникальные в А. Записи из таблицы А, которые не совпадают с записями из таблицы В.

Если немного изменить запрос, то получим уникальные записи из таблицы B.
SELECT * FROM tableA RIGHT OUTER JOIN tableB ON tableA.name = tableB.name
WHERE tableA.id IS null
id name id name
-- ---- -- ----
null null 1 Тыква
null null 3 Дыня
FULL OUTER JOIN

SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.name = tableB.name
id name id name
-- ---- -- ----
1 Яблоко 2 Яблоко
2 Ананас null null
3 Банан 4 Банан
4 Груша null null
null null 1 Тыква
null null 3 Дыня
Выбираем все записи в обоих таблицах с совпадением записей с обоих сторон, где это возможно. Если совпадения нет, то пропускающая сторона будет содержать значение null.
FULL OUTER JOIN WHERE A or B id IS NULL

SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.name = tableB.name
WHERE tableA.id IS null OR tableB.id IS null
id name id name
-- ---- -- ----
2 Ананас null null
4 Груша null null
null null 1 Тыква
null null 3 Дыня
Как объединить две, три и более таблиц на SQL?
Например у меня есть 3 таблицы:
Таблица 1 (содержит данные source A): Date, Campaign, Ad, Impression, Click, Cost
Таблица 2 (содержит данные sourse B): DateTime, Campaign, Ad, Impression, Click, Cost
Таблица 3 (содержит данные различных sourse): Date, Source, Campaign, Ad, App Install, Purchase
Мне требуется написать запрос, который объединил бы все 3 таблицы и выводил поля за текущий месяц:
Date, Source, Campaign, Ad, SUM(Click), SUM(Cost), SUM(App Install), SUM(Purchase)
Замечания:
sourse в таблице 3 может быть больше 2
пример поля date: ‘2021-05-01’,
пример поля datetime ‘2021-05-01 12:31:47’
- Вопрос задан более двух лет назад
- 864 просмотра
Комментировать
Решения вопроса 1
примерно так
select `Date`, source, Campaign, Ad, SUM(Click), SUM(Cost), SUM(`App Install`), SUM(Purchase) from ( select `Date`, 'source A' as source, Campaign, Ad, Click, Cost, null as `App Install`, null as Purchase from table1 union select date(`DateTime`), 'source B', Campaign, Ad, Click, Cost, null, null from table2 union select `Date`, Source, Campaign, Ad, null, null, `App Install`, Purchase from table3 ) t group by `Date`, source, Campaign, Ad
Ответ написан более двух лет назад
Нравится 2 1 комментарий
JediKhan @DenisBezukhov Автор вопроса
Я думал, что лучше через FULL OUTER JOIN a потом через RIGHT JOIN, но у меня не получалось, сейчас попробую, как ты написал. Спасибо большое за отклик!
Ответы на вопрос 1
Читайте про JOIN
Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- SQL
- +1 ещё
Массив структур в Hive. Как проверить вхождение в массив структуры по маске?
- 1 подписчик
- вчера
- 72 просмотра
