Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/27: Рейтинг темы: голосов - 27, средняя оценка - 4.70
2 / 2 / 1
Регистрация: 05.12.2008
Сообщений: 9
1

Удаление через связывание таблиц

14.09.2009, 12:32. Показов 5113. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет!
Есть таблица на которую ссылаются множество других таблиц. Необходимо удалить записи из дочерних таблиц.
Вот главная таблица:
SQL Скопировано
1
2
3
4
5
6
CREATE TABLE EDGE (
    EDGEID     INTEGER NOT NULL,
    RAILWAYID  INTEGER NOT NULL
    ....
);
ALTER TABLE EDGE ADD PRIMARY KEY (EDGEID);
И вот пример дочерней:
SQL Скопировано
1
2
3
4
CREATE TABLE NBUILD (
    EDGEID  INTEGER NOT NULL,
    ....
);
Собственно проблема в том, что сейчас я удаляю ненужные записи из дочерних таблиц отдельными запросами типа:

SQL Скопировано
1
2
DELETE FROM nbuild WHERE EdgeID IN 
(SELECT EdgeID FROM edge WHERE RailwayID = :WAY_ID);
Дочерних таблиц около 20, и такое удаление работает очень медленно. Я хочу написать один запрос на удаление, объединяющий все таблицы, но не знаю как это сделать в Firebird. (Firebird 2.5.0)
Вот такой запрос я писал для MySQL:
SQL Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
DELETE
  FROM 
  nbuild, 
  ncategory
  ......
  USING edge e
  INNER JOIN nbuild
  INNER JOIN ncategory
  .....
  WHERE 
   nbuild.edgeid = e.edgeid AND 
   ncategory.edgeid = e.edgeid
   .....
Сколько не пытался соединить таблицы с помощью join в FB, ничего не выходит.
Заранее всем благодарен за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.09.2009, 12:32
Ответы с готовыми решениями:

связывание таблиц
Возможно ли привязать к ключевому полю 1 таблицы несколько таблиц, через внешний ключ (например к полю id_personal(pk) главной таблицы...

Связывание таблиц
Возможно ли привязать к ключевому полю 1 таблицы несколько таблиц, через внешний ключ (например к полю id_personal(pk) 3 таблицы, у которых...

Связывание таблиц
День добрый, столкнулся со странным, с моей точки зрения, поведением таблицы в базе firebird 2.1, при удалении записи происходит так же...

4
 Аватар для BasicMan
19317 / 2624 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
14.09.2009, 12:49 2
я конечно не знаток файрабёрда, но вот что я
нагуглил
Явные join Синтаксис явных объединений появился в SQL92 (поэтому в той книге М. Грабера, которая находится в интернете, нет упоминания о join - она вышла до 1992 года. Зато полное описание явных join есть в более новом издании этой же книги). InterBase поддерживает явные join в стандартном синтаксисе с версии 4.0. Вот поддерживаемый синтаксис join из langref.pdf = tableref join_type JOIN tableref ON search_condition | (joined_table) = [INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} Это означает, что INNER JOIN = JOIN, а LEFT/RIGHT OUTER JOIN = LEFT/RIGHT JOIN, то есть слова INNER и OUTER являются необязательными. При этом, в отличие от неявного join, условие объединения таблиц (on) и условия "фильтрации" where разделены.

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

Не по теме:

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

классический синтаксис еще никто не отменял
0
2 / 2 / 1
Регистрация: 05.12.2008
Сообщений: 9
14.09.2009, 13:07  [ТС] 3
Цитата Сообщение от CyberБурундукЪ Посмотреть сообщение
я конечно не знаток файрабёрда, но вот что я нагуглил
Проблема то в том, что я как раз могу написать сам запрос.
Вот пример того, что писал
SQL Скопировано
1
2
3
4
5
6
7
SELECT COUNT(*) FROM
 edge e
   JOIN nbuild b
   JOIN ncategory c
WHERE e.edgeid = b.edgeid AND
      c.edgeid = b.edgeid AND
      e.railwayid = 164;
P.S. Ну я сначала хотел написать просто select, а потом уже delete

Цитата Сообщение от CyberБурундукЪ Посмотреть сообщение
кстати, если б я сразу твой код посмотрел, то заметил бы, что отсутствует ключевое слово ON после таблицы
Согласен. )) Но этот код для mysql, а там при использовании using table_name не надо писать on после inner join.
0
 Аватар для BasicMan
19317 / 2624 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
14.09.2009, 13:14 4
Цитата Сообщение от Moon Wolf Посмотреть сообщение
Но этот код для mysql, а там при использовании using table_name не надо писать on после inner join.

то ли я идиот, то ли объясняю плохо. одного из 2х, но
вот кусог нагуглил про джойны в мускле:
Что такое JOINы в MySQL

В MySQL термин JOIN используется гораздо шире, чем можно было бы предположить. Здесь JOINом может называться не только запрос объединяющий результаты из нескольких таблиц, но и запрос к одной таблице, например, SELECT по одной таблице — это тоже джоин.

Все потому, что алгоритм выполнения джоинов в MySQL реализован с использованием вложенных циклов. Т.е. каждый последующий JOIN это дополнительный вложенный цикл. Чтобы выполнить запрос и вернуть все записи удовлетворяющие условию MySQL выполняет цикл и пробегает по записям первой таблицы параллельно проверяя соответствия условиям описанных в теле запроса, когда находятся записи, удовлетворяющие условиям — во вложенном цикле по второй таблице ищутся записи соответствующие первым и удовлетворяющие условиям проверки и т.д.

Прмер обычного запроса с INNER JOIN

SQL Скопировано
1
2
3
4
5
6
7
8
9
10
    SELECT
      *
    FROM
      Table1
    INNER JOIN
      Table2 ON P1(Table1,Table2)
    INNER JOIN
      Table3 ON P2(Table2,Table3)
    WHERE
       P(Table1,Table2,Table3)
.

повторюсь еще раз, не побоюсь:
Цитата Сообщение от CyberБурундукЪ Посмотреть сообщение
классический синтаксис еще никто не отменял
Добавлено через 53 секунды
так вот там тоже ОН как это ни странно )))
0
2 / 2 / 1
Регистрация: 05.12.2008
Сообщений: 9
15.09.2009, 14:08  [ТС] 5
Решил отказаться от связывания через join, т.к. нашел способ, с помощью которого можно быстро удалить необходимые мне записи.

SQL Скопировано
1
2
FOR SELECT EdgeID FROM edge WHERE RailwayID=:WAY_ID INTO :EDGE_ID DO
   DELETE FROM nbuild WHERE EdgeID=:E_ID;
Спасибо CyberБурундукЪ за помощь. ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2009, 14:08
Помогаю со студенческими работами здесь

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

Связывание таблиц через функцию ВПР
Помогите разобраться с самостоялкой! файл вовложении. я пробовал это сделать через функцию впр, но как-то не получается... ((( ...

Связывание двух таблиц через ADOQuery
У меня база данных, с двумя таблицами. Хочу связать их через ADOquery, как в ADOtable через диаграмму(Master Field). Если конкретно, то...

Связывание двух таблиц через одно поле
вот у меня такая программа. . При выборе курса показывает группы из того курса. Я связал две таблицы через столбик "Курсы" ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Перечисления в TypeScript: использование и лучшие практики
run.dev 18.03.2025
Пишете код и устали от разбросанных по проекту "волшебных" строк и чисел? Знакомая ситуация: где-то в глубине кода притаилась строка "ADMIN", а в другом месте используется "admin". И вот уже. . .
Фишки Kotlin, которые все любят
Javaican 18.03.2025
Помню, как скептически относился к появлению "ещё одного языка для JVM" — мол, зачем нам что-то новое, когда есть Java? Но первый же проект на Kotlin заставил меня пересмотреть свое мнение. Код стал. . .
Списки и кортежи в Python: различия, особенности, применение
py-thonny 18.03.2025
Если вы когда-нибудь писали код на Python, то наверняка сталкивались с конструкциями вида или ('имя', 25, 'инженер'). Это и есть списки и кортежи — последовательности, хранящие упорядоченные наборы. . .
Интеграция JavaScript в Haskell
golander 18.03.2025
Ключевая особенность нового JS-бэкенда GHC — возможность создавать колбэки из JavaScript в Haskell-код. Это открывает дорогу разработке полноценных браузерных приложений, позволяя реагировать на. . .
Циклы for в Python
py-thonny 17.03.2025
Существует множество ситуаций, когда нам нужно выполнить одно и то же действие несколько раз. Цикл for в Python — настоящий рабочий конь для большинства программистов. Если вам нужно пройтись по всем. . .
Предсказание ветвлений - путь к высокопроизводи­тельному C++
NullReferenced 17.03.2025
В высокопроизводительном программировании на C++ каждый такт процессора на счету. Когда речь заходит о разработке систем с низкой задержкой — будь то высокочастотная торговля, обработка потоковых. . .
Паттерн CQRS в C#
UnmanagedCoder 17.03.2025
Создание сложных корпоративных приложений часто требует нестандартных подходов к архитектуре. Один из таких подходов — паттерн CQRS (Command Query Responsibility Segregation), предлагающий простую,. . .
Паттерн Цепочка ответственности в C#
UnmanagedCoder 17.03.2025
Цепочка ответственности — это поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке потенциальных обработчиков, пока один из них не обработает запрос. . . .
Создаем микросервисы с NestJS, TCP и Typescript
run.dev 17.03.2025
NestJS — фреймворк, который значительно упрощает создание серверных приложений на Node. js. Его прелесть в том, что он комбинирует концепции ООП, функционального программирования и предлагает. . .
Гексагональная архитектура со Spring Boot
Javaican 17.03.2025
Если вы когда-нибудь сталкивались с ситуацией, когда внесение простых изменений в базу данных или пользовательский интерфейс заставляло вас переписывать весь код, то вы точно оцените элегантность. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер