SQL соединяет две таблицы, выбирая только один идентификатор

#sql

Вопрос:

У меня есть следующая проблема, и я понятия не имею, как ее решить…

У нас есть 2 стола:

КОМПАНИИ ОЦЕНИЛИ

ID Имя оценка
1 амазонка Правда
2 Google Правда
3 Facebook Правда

КОМПАНИИ СМЕШАННЫЕ

ID Имя оценка
1 амазонка Ложный
2 Google Ложный
3 Facebook Ложный
4 ТЕСЛА Ложный

Ну, я хочу ПРИСОЕДИНИТЬСЯ К ОБЕИМ ТАБЛИЦАМ, но НЕ ПОВТОРЯЙТЕ ИДЕНТИФИКАТОРЫ. Если идентификатор появляется 2 раза в таблице результатов, я хочу СОХРАНИТЬ ИСТИННЫЙ и удалить Ложный.

Пример ответа, которого я ожидал:

КОМПАНИИ ФИНАЛ

ID Имя оценка
1 амазонка Правда
2 Google Правда
3 Facebook Правда
4 ТЕСЛА Ложный

В этом примере вы можете подумать: «Я добавляю ТЕСЛУ в первую таблицу, EZ», но это не тот ответ, который я ищу. Мне нужно что-то вроде ПРИСОЕДИНЕНИЯ к АУТСАЙДЕРАМ или что-то в этом роде. Я пытаюсь, но для меня это невозможно.

Спасибо, ребята.

Комментарии:

1. Что делать, если истина встречается дважды? Вы бы отфильтровали использование where estimation = 'true' .

2. ОБЪЕДИНЕНИЕ ВСЕХ, ГРУППА ПО, МАКС.

3. Какие СУБД вы используете? Будут ли в Estimated таблице записи, которых тоже НЕ будет в Mixed таблице?

4. Что должно произойти, когда идентификатор/имя отличаются, скажем, идентификатор 1 = GOOGLE и идентификатор 2 = AMAZON во второй таблице?

5. @JNevill ОЦЕНЕННЫЕ КОМПАНИИ могут иметь значение TRUE или FALSE, В СМЕШАННЫХ КОМПАНИЯХ есть только ЛОЖНЫЕ ДАННЫЕ. Я хочу, чтобы, если в КОМПАНИИ ПОСЛЕДНИЕ два идентификатора совпадают, сохраняли поле «ОЦЕНЕННЫЕ КОМПАНИИ» и отбрасывали СМЕШАННЫЕ КОМПАНИИ.

Ответ №1:

UNION ALL столы. GROUP BY вот и результат. Используйте MAX() для получения значения true, если оно доступно, в противном случае false.

 select id, name, max(estimation)
from
(
  select id, name, estimation from COMPANIES_ESTIMATED
  union all
  select id, name, estimation from COMPANIES_MIXED
) dt
group by id, name
 

Ответ №2:

Если для всех записей КОМПАНИЙ СМЕШАННАЯ таблица estimation = 'false' , следующий запрос может помочь:

 SELECT * FROM COMPANIES_ESTIMATED
UNION
SELECT * FROM COMPANIES_MIXED WHERE id NOT IN (SELECT id FROM COMPANIES_ESTIMATED)
 

Иначе

 SELECT id, name, MAX(estimation) FROM (
    SELECT * FROM COMPANIES_ESTIMATED
    UNION ALL
    SELECT * FROM COMPANIES_MIXED) AS all_companies
GROUP BY id, name;
 

Комментарии:

1. Это было бы лучше с UNION ALL вместо UNION [DISTINCT] . И обратные ссылки вокруг имен таблиц не являются стандартным SQL. Единственные известные мне СУБД, разрешающие обратные ссылки на имена, — это MySQL и MariaDB.

2. @Торстенкеттнер согласен. Я соответствующим образом отредактировал свой ответ

Ответ №3:

просто чтобы немного все перепутать, вы могли бы сделать это с полным внешним соединением. не уверен, какую СУБД вы используете, но вот одна из них в sql server

 select IIF(a.id>b.id, a.id, b.id) id,
IIF(a.name>b.name, a.name, b.name) Name,
IIF(a.estimation>b.estimation, a.estimation, b.estimation) estimation
from companies_estimated a
full outer join companies_mixed b
on (a.id = b.id and a.name = b.name);
 

вот скрипка
http://sqlfiddle.com/#!18/b87f66/13

Ответ №4:

Предполагая, что есть другие колонки, которые нужно взять с собой:

 with data as (
    select *, row_number()
        over (partition by id order by estimation desc) rn
    from
    (
        select id, name, estimation, ... from COMPANIES_ESTIMATED
        union all
        select id, name, estimation, ... from COMPANIES_MIXED
    ) t
)
select * from data where rn = 1
 

Ответ №5:

Вы также можете использовать FULL OUTER JOIN

 SELECT 
  COALESCE(estimated.id, mixed.id) AS id, 
  COALESCE(estimated.name, mixed.name) AS name, 
  COALESCE(estimated.estimation, mixed.estimation) AS estimation
FROM 
  estimated 
  FULL OUTER JOIN mixed
  ON estimated.id = mixed.id
ORDER BY
  id
 

Пример на http://sqlfiddle.com/#!18/dc483a/1

Комментарии:

1. Конкретный ответ продукта на вопрос без указания СУБД. По крайней мере, скажите нам, для какой СУБД это предназначено.

2. @jarlh это было для MSSQL, но после комментариев OP значение ISNULL и побитовое значение не требуется. Так что теперь он должен соответствовать стандарту.

3. ANSI SQL имеет псевдоним столбца после выражения, например COALESCE(estimated.id, mixed.id) AS id . MS SQL Server тоже поддерживает это — и это портативно! ( id в id = COALESCE(estimated.id, mixed.id) даст неоднозначную ошибку столбца, согласно ANSI SQL. id в ПОРЯДКЕ тоже.)

4. СУБД-это MySQL на Athena.