Проверьте наличие данных в двух строках из двух таблиц

0

У меня есть задача создать представление, которое добавит столбец, который проверяет, соответствуют ли данные в двух строках одной таблицы тем же двум строкам другой таблицы.

У меня есть эти таблицы:

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 строки

Какие-нибудь мысли?

  • 1
    как вы объединяете 2 таблицы?
  • 0
    Таблицы не должны быть объединены. данные из одного не присоединяются к другой таблице. Это просто проверка с использованием оператора case. и затем добавление 1, если оператор case равен true, и 0, если это false. Проблема в том, что очень простой оператор case дважды запускает false для всего, что он находит, чтобы пометить как false, и один раз для всего, что он находит, чтобы пометить как 1.
Теги:

2 ответа

0

Благодаря помощи одного из моих коллег это решение:

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 для обеих таблиц. Таким образом, показаны дубликаты каждой строки. Поэтому требуется конкретное соединение. Внутреннее соединение будет отображать только те данные, которые существуют в обоих.

Тем не менее, левое внешнее соединение будет отображать все данные в левой таблице и данные, где они существуют в правой таблице.

надеюсь, это помогает другим в той же ситуации.

0

Обычно это будет решаться с помощью полного внешнего соединения, но 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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню