Синхронизация N значений по таблицам в SQL - PullRequest
1 голос
/ 11 августа 2009

Отказ от ответственности: я только начал с баз данных, поэтому я, вероятно, упускаю что-то очень тривиальное.

У меня есть две (несколько связанных, но недостаточно, чтобы быть одной таблицей) таблицы: table_one и table_two.


table_one имеет два столбца значимости:

  1. name типа varchar(n)
  2. intersects типа bit

table_two имеет один столбец значимости:

  1. name типа varchar(n)

Я бы хотел автоматически установить intersects на 0 или 1 в зависимости от того, присутствует ли name в table_two.

Могу ли я как-то делегировать эту ответственность ядру базы данных? В настоящее время я использую MySQL, если это имеет значение.


РЕДАКТИРОВАТЬ: Имеет ли смысл подобная тесная связь даже при работе с базами данных?

1 Ответ

1 голос
/ 11 августа 2009

ANSI SQL:

update table_one
set intersects = 
    case when 
        (select count(*) from table_two where name = table_one.name) > 0 
        then 1 
    else 0 end

MySQL Присоединиться:

update table_one t1
    left join table_two t2 on
        t1.name = t2.name
set t1.intersects = case when t2.name is not null then 1 else 0 end

Вы можете поместить этот запрос в trigger, чтобы поддерживать intersects в актуальном состоянии:

create trigger intersections after insert for each row
begin

    update table_one t1
        left join table_two t2 on
            t1.name = t2.name
    set t1.intersects = case when t2.name is not null then 1 else 0 end
    where t1.name = new.name

end

Теперь для обсуждения дизайна:

Столбец intersects хорош и все, но вы можете столкнуться с проблемой, когда он не синхронизирован. Что вы можете сделать, это использовать exists функцию в вашем select при вызове этого:

select
    *
from
    table_one t1
where
    exists (select 1 from table_two t2 where t2.name = t1.name)

Вы можете использовать not exists, чтобы найти и те, которые не пересекаются.

Кроме того, вы также можете использовать left join для возврата обоих случаев:

select
    *
from
    table_one t1
    left join table_two t2 on
        t1.name = t2.name

Что-нибудь, где t2.name равно null, у вас нет пересечения. Все, что не так, вы делаете. Конечно, это может привести к дублированию строк, если у вас нет ограничения unique на name.

Надеюсь, это проливает некоторый свет на все это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...