У меня есть задача создать представление, которое добавит столбец, который проверяет, соответствуют ли данные в двух строках одной таблицы тем же двум строкам другой таблицы.
У меня есть эти таблицы:
Table 1
Name ID Team
John 35 1
Josh 89 1
Josh 89 2
Josh 89 3
Jim 25 2
Table2
Name ID Team
Josh 89 1
John 35 1
Мне нужно создать представление, добавляет столбец, который помещает число 1, когда table1.id и table1.team соответствуют table2.id и table2.team. Как это:
NEW view
NAME ID TEAM CHECK
John 35 1 1
Josh 89 1 1
Josh 89 2 0
Josh 89 3 0
Jim 25 2 0
Тем не менее, ближе всего я могу получить этот код:
Select distinct
table1.name, table1.id, table1.team,
CASE
WHEN
(table1.id = table2.id)
AND
(table1.team = table2.team)
THEN 1
ELSE 0
END AS check
FROM
table1, table2 order by check desc;
Что возвращает:
NEW view
NAME ID TEAM CHECK
John 35 1 1
Josh 89 1 1
John ---- 35 ----- 1 ----- 0
Josh ---- 89 ----- 1 ----- 0
Josh 89 2 0
Josh 89 3 0
Jim 25 2 0
без четких я получаю дубликаты каждой строки и с разными я получаю одну строку labled 0 для каждой строки, которая имеет 1
Я старался:
Select a.id, a.team,
CASE
WHEN
( select a.id from v_admins a
Where
a.id = (select o.id from oncallorder o)
And
a.team = ( select o.team from oncallorder o)
)
THEN 1
ELSE 0
END AS adminisoncall
FROM v_admins a, oncallorder o
order by adminisoncall desc;
но он просто с ошибками: Код ошибки: 1242. Подзапрос возвращает более 1 строки
Какие-нибудь мысли?
Благодаря помощи одного из моих коллег это решение:
Select table1.name, table1.id, table1.team,
CASE
WHEN
table2.team is not null
THEN 1
ELSE 0
END as check
FROM table1 left outer join table2
on table1.id = table2.id and table1.team = table2.team
order by check desc;
В заявлении дела фактически может содержаться раздел:
(table1.id = table2.id) AND (table1.team = table2.team)
однако не нулевой - это все, что действительно необходимо. Реальная проблема возникла из-за наличия двух таблиц в разделе FROM. Это непреднамеренно создало кросс-соединение, где ему нужно было выполнить вышеуказанный оператор select для обеих таблиц. Таким образом, показаны дубликаты каждой строки. Поэтому требуется конкретное соединение. Внутреннее соединение будет отображать только те данные, которые существуют в обоих.
Тем не менее, левое внешнее соединение будет отображать все данные в левой таблице и данные, где они существуют в правой таблице.
надеюсь, это помогает другим в той же ситуации.
Обычно это будет решаться с помощью полного внешнего соединения, но MySQL этого не поддерживает.
Однако задачи показывают, что таблицы не содержат дубликатов. Это также предполагает, что мы можем включать имя в сравнение. Таким образом, вы можете просто посмотреть на объединение таблиц и обнаружить дубликаты:
select name, id, team, case when count(*) > 1 then 1 else 0 end as check
from
(
select name, id, team from table1
union all
select name, id, team from table2
) data
group by name, id, team;