Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 7. Нужно составить SQL запрос / 8 сообщений из 8, страница 1 из 1
26.12.2005, 12:18
    #33457167
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
Дано:
база ASA7
таблица товаров
из других таблиц на таблицу товаров куча FK (прим 3 десятка таблиц), либо просто прописаны айдишники

Требуется:
удалить все товары, айдишники которых не найдены в других таблицах.

Такая задачка появляется после чистки базы от старых записей.
...
Рейтинг: 0 / 0
26.12.2005, 13:09
    #33457318
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DELETE FROM Products WHERE ProductID NOT IN 
(
  SELECT ProductID FROM Table1
   UNION 
  SELECT ProductID FROM Table2
   UNION
  ...
)
...
Рейтинг: 0 / 0
26.12.2005, 13:26
    #33457355
rashman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
jimmers
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DELETE FROM Products WHERE ProductID NOT IN 
(
  SELECT ProductID FROM Table1
   UNION 
  SELECT ProductID FROM Table2
   UNION
  ...
)


смешно. очень смешно. а если у меня таблиц не 30, а 300? 8о)

ну наверняка должен быть простой способ проверки завязки хотя бы по существующему FK!!!
...
Рейтинг: 0 / 0
26.12.2005, 13:38
    #33457395
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
rashman wrote:

> смешно. очень смешно.

Ответ дан по существу.

> ну наверняка должен быть простой способ проверки завязки хотя бы по
> существующему FK!!!

Пробуй удалять по одной каждую запись. На те, что удалятся, ссылок не было.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
26.12.2005, 13:58
    #33457455
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
Если записей не так много и на FK нет CASCADE DELETE:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
BEGIN
  LOCK TABLE Table1;

  FOR lRow AS cRow NO SCROLL CURSOR FOR
    SELECT id AS @id
    FROM @Table1
  DO
    BEGIN
      DELETE FROM Table1 WHERE id = @id;

      MESSAGE @id || ' удалена' TO CLIENT;
    EXCEPTION
      WHEN OTHERS THEN
        MESSAGE @id || ' оставляется' TO CLIENT;
    END;
  END FOR;
END;

Иначе, если каждая таблица только один раз ссылается, FK поле везде одинаково называется и оно не составное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
BEGIN
  DECLARE LOCAL TEMPORARY TABLE #Result (id NOT NULL PRIMARY KEY);

  FOR lRow AS cRow NO SCROLL CURSOR FOR
    SELECT '"' || fo.User_Name || '"."' || ft.table_name || '"' AS @Table
    FROM sys.SYSFOREIGNKEY fk
      INNER JOIN sys.SYSTABLE ft ON ft.table_id = fk.foreign_table_id
      INNER JOIN sys.SYSUSERPERM fo ON fo.User_id = ft.Creator
      INNER JOIN sys.SYSTABLE pt ON pt.table_id = fk.primary_table_id
      INNER JOIN sys.SYSUSERPERM pf ON pf.User_id = pt.Creator
    WHERE pt.Table_Name = 'Table1' AND pf.User_Name = 'DBA'
  DO
    EXECUTE IMMEDIATE 
      'INSERT INTO #Result (id) SELECT fk_id FROM ' || @Table ||
      '  WHERE fk_id NOT IN (SELECT id FROM #Result)';
  END FOR;

  DELETE FROM Table1
  WHERE id NOT IN (SELECT id FROM #Result);
END;
Иначе этот запрос нужно усложнять или сделать, как предложил jimmers.
...
Рейтинг: 0 / 0
26.12.2005, 14:04
    #33457470
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
авторну наверняка должен быть простой способ проверки завязки хотя бы по существующему FK!!!
Я показал "простой" способ По моему легче 30 таблиц один раз в запрос вбить, оформить как ХП и не маятся ...

На будующее: главное никогда не говорить "если", потому как это слово всегда перечеркивает нормальные решения и заставляет девелоперов вместо того, чтобы заниматься делом, фантазировать, изобретая универсальные, а значит ужасные и неуклюжие решения. Вы всегда четко должны знать, когда у Вас 30 таблиц, а когда 300 и уже исходя из знаний выбирать решение. Мне что то с трудом верится, что у Вас схема БД будет вдруг динамически так расти по кол-ву таблиц.
...
Рейтинг: 0 / 0
27.12.2005, 06:00
    #33458487
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
Можно, конечно, не прямо в лоб перечислить 30 таблиц, а вытащить их имена через системные таблицы. Но сомнения не вызывает, что так будет дольше работать и займет больше времени на разработку.
...
Рейтинг: 0 / 0
28.12.2005, 09:36
    #33460998
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ASA 7. Нужно составить SQL запрос
rashman jimmers
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DELETE FROM Products WHERE ProductID NOT IN 
(
  SELECT ProductID FROM Table1
   UNION 
  SELECT ProductID FROM Table2
   UNION
  ...
)


смешно. очень смешно. а если у меня таблиц не 30, а 300? 8о)

ну наверняка должен быть простой способ проверки завязки хотя бы по существующему FK!!!

А если у тебя ещё FK не расставлены?
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA 7. Нужно составить SQL запрос / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]