#sql
Вопрос:
У меня есть следующая проблема, и я понятия не имею, как ее решить…
У нас есть 2 стола:
КОМПАНИИ ОЦЕНИЛИ
ID | Имя | оценка |
---|---|---|
1 | амазонка | Правда |
2 | Правда | |
3 | Правда |
КОМПАНИИ СМЕШАННЫЕ
ID | Имя | оценка |
---|---|---|
1 | амазонка | Ложный |
2 | Ложный | |
3 | Ложный | |
4 | ТЕСЛА | Ложный |
Ну, я хочу ПРИСОЕДИНИТЬСЯ К ОБЕИМ ТАБЛИЦАМ, но НЕ ПОВТОРЯЙТЕ ИДЕНТИФИКАТОРЫ. Если идентификатор появляется 2 раза в таблице результатов, я хочу СОХРАНИТЬ ИСТИННЫЙ и удалить Ложный.
Пример ответа, которого я ожидал:
КОМПАНИИ ФИНАЛ
ID | Имя | оценка |
---|---|---|
1 | амазонка | Правда |
2 | Правда | |
3 | Правда | |
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.