Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление из подчиненых таблиц / 16 сообщений из 16, страница 1 из 1
24.08.2002, 07:46:01
    #32045683
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Что-то не нашел вопроса в темах.
Есть таблица1 (счета)
Есть таблица2 (строки счета)
Есть таблица3 (расшифровка строк счета)
Все это последовательно связано один-ко-многим

Как по ID счета удалить записи из таблицы3?
...
Рейтинг: 0 / 0
24.08.2002, 09:15:02
    #32045689
Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Тут наверное и не ответит никто. В BOL есть описание такого оператора - DELETE называется. Вот он как раз и отвечает за удаление записей в таблицах. По-моему это как раз и есть то что надо использовать :)

-- Слон
...
Рейтинг: 0 / 0
24.08.2002, 10:22:22
    #32045690
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Про DELETE я знаю. Фокус в том, чтобы удалить записи из Таблицы3 без удаления записей из Таблица1 и Таблица2.

Поясню примером:
Вот такой запрос в Access отрабатывает без проблем

DELETE Таблица3.*, Таблица1.tbl1_RecID
FROM (Таблица1 INNER JOIN Таблица2 ON Таблица1.tbl1_RecID = Таблица2.ParentID) INNER JOIN Таблица3 ON Таблица2.tbl2_RecID = Таблица3.ParentID
WHERE (((Таблица1.tbl1_RecID)=123))

А аналог в SQL Server отказывается, кричит несколько base tables
...
Рейтинг: 0 / 0
24.08.2002, 11:10:41
    #32045691
Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Код: plaintext
1.
DELETE FROM t3
FROM t1 INNER JOIN t2 ON .... INNER JOIN t3 ON .....

-- Слон
...
Рейтинг: 0 / 0
24.08.2002, 12:52:20
    #32045702
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Да но теперь вот это удаляет все записи

DELETE from table3
FROM (table1 INNER JOIN table2 ON table1.t1 = table2.t1) INNER JOIN table3 ON table2.t2 = table3.t2
WHERE (((table1.t1)=1))

А не только соответствующие условию
...
Рейтинг: 0 / 0
24.08.2002, 14:18:38
    #32045706
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
IMHO правильнее будет

DELETE table3
FROM table3 INNER JOIN table2 ON table3.t2 = table2.t2
INNER JOIN table1 ON table2.t1 = table1.t1
WHERE table1.t1=1
...
Рейтинг: 0 / 0
24.08.2002, 18:42:30
    #32045719
MarchCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Я не опаздал :)))))
И не лень мне было столько набрать ....

Судя по Вашему коду вы пользовались автопостроилелем запросов :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Use Pubs
if exists (select * from sysobjects where name = 'Table1' and type='U') drop table Table1
if exists (select * from sysobjects where name = 'Table2' and type='U') drop table Table2
if exists (select * from sysobjects where name = 'Table3' and type='U') drop table Table3

create table Table1 (id int IDENTITY ( 1 ,  1 )	not null, name	varchar( 50 )) 
create table Table2 (id int IDENTITY ( 1 ,  1 )	not null, idp int not null, name	varchar( 50 )) 
create table Table3 (id int IDENTITY ( 1 ,  1 )	not null, idp int not null, name	varchar( 50 )) 

Declare @intTmp1 int, @intTmp2 int
Set @intTmp1 =  0 
Set @intTmp2 =  0 

Insert into Table1 (name) values ('11')
Set @intTmp1 = @@Identity
Insert into Table2 (idp,name) values (@intTmp1,'211')
Insert into Table2 (idp,name) values (@intTmp1,'212')
Insert into Table2 (idp,name) values (@intTmp1,'213')

Insert into Table1 (name) values ('12')
Set @intTmp1 = @@Identity
Insert into Table2 (idp,name) values (@intTmp1,'221')
Insert into Table2 (idp,name) values (@intTmp1,'222')
Insert into Table2 (idp,name) values (@intTmp1,'223')

Insert into Table1 (name) values ('13')
Set @intTmp1 = @@Identity
Insert into Table2 (idp,name) values (@intTmp1,'231')
Insert into Table2 (idp,name) values (@intTmp1,'232')
Insert into Table2 (idp,name) values (@intTmp1,'233')

Set @intTmp2 = @@Identity
Insert into Table3 (idp,name) values (@intTmp2,'311')
Insert into Table3 (idp,name) values (@intTmp2,'312')
Insert into Table3 (idp,name) values (@intTmp2,'313')
 ---------------------------------------------------------
 
select * 
	From Table1 a 
		inner join Table2 b on b.idp=a.id
		inner join Table3 c on c.idp=b.id
 ---------------------------------------------------------
 
DELETE Table3
	FROM Table1 
		INNER JOIN Table2 ON Table1.id = Table2.idp 
		INNER JOIN Table3 ON Table2.id = Table3.idp 
	WHERE Table1.id= [b]3 [/b]
 ---------------------------------------------------------
 
select * 
	From Table1 a 
		inner join Table2 b on b.idp=a.id
		inner join Table3 c on c.idp=b.id
...
Рейтинг: 0 / 0
24.08.2002, 20:22:10
    #32045723
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
2 Glory

Этот вариант удаляет все записи из Table3

Похоже, что версия MarchCat тоже, так ка не вижу разницы, но пока не проверил
...
Рейтинг: 0 / 0
24.08.2002, 20:28:19
    #32045724
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
2 MarchCat

Именно

Удаляются все записи из Table3. Не работает! Проклятье
...
Рейтинг: 0 / 0
25.08.2002, 00:34:43
    #32045725
Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Марат,

Ты бы поглядел еще раз на данные, которые ты удаляешь? В Table3 у тебя idp=9 у всех строк. Соответственно, в Table2 у строки с id=9 idp=3. Значит и правильно, что удаляются все строки из Table3. Ты вот что сделай:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
Use Pubs
if exists (select * from sysobjects where name = 'Table1' and type='U') drop table Table1
if exists (select * from sysobjects where name = 'Table2' and type='U') drop table Table2
if exists (select * from sysobjects where name = 'Table3' and type='U') drop table Table3

create table Table1 (id int IDENTITY ( 1 ,  1 )	not null, name	varchar( 50 )) 
create table Table2 (id int IDENTITY ( 1 ,  1 )	not null, idp int not null, name	varchar( 50 )) 
create table Table3 (id int IDENTITY ( 1 ,  1 )	not null, idp int not null, name	varchar( 50 )) 

Declare @intTmp1 int, @intTmp2 int
Set @intTmp1 =  0 
Set @intTmp2 =  0 

Insert into Table1 (name) values ('11')
Set @intTmp1 = @@Identity
Insert into Table2 (idp,name) values (@intTmp1,'211')
Insert into Table2 (idp,name) values (@intTmp1,'212')
Insert into Table2 (idp,name) values (@intTmp1,'213')

Insert into Table1 (name) values ('12')
Set @intTmp1 = @@Identity
Insert into Table2 (idp,name) values (@intTmp1,'221')
Insert into Table2 (idp,name) values (@intTmp1,'222')
Insert into Table2 (idp,name) values (@intTmp1,'223')

Insert into Table1 (name) values ('13')
Set @intTmp1 = @@Identity
Insert into Table2 (idp,name) values (@intTmp1,'231')
Insert into Table2 (idp,name) values (@intTmp1,'232')
Insert into Table2 (idp,name) values (@intTmp1,'233')

Set @intTmp2 = @@Identity
Insert into Table3 (idp,name) values (@intTmp2,'311')
Insert into Table3 (idp,name) values (@intTmp2,'312')
Insert into Table3 (idp,name) values (@intTmp2,'313')
Insert into Table3 (idp,name) values ( 1 ,'xxx')
 ---------------------------------------------------------
 
DELETE FROM t3
FROM Table1 t1
     INNER JOIN Table2 t2
          ON t1.id = t2.idp
     INNER JOIN Table3 t3
          ON t2.id = t3.idp
     WHERE t1.id =  1 


Кстати, Glory, а в чем разница, я честно говоря не вижу, почему порядок указания таблиц в JOIN играет роль?

-- Слон
...
Рейтинг: 0 / 0
25.08.2002, 01:24:10
    #32045726
Almi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Если столы связаны по ключевым полям один ко многим то таки так наверно:

Delete from t3 where id_t2 in
(select id from t2 where id_t1=:id_t1)

где :id_t1 тот счет записи которого нуно снести из t3
...
Рейтинг: 0 / 0
25.08.2002, 07:10:12
    #32045729
MarchCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
to Слон

Согласен! Как я сам не догадался :))))
...
Рейтинг: 0 / 0
25.08.2002, 08:43:36
    #32045732
Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Almi,

Вы привели совершенно ужасный пример того, как нельзя писать запросы к базе данных. Пойжу приму 300 капель эфирной валерьянки... :)

-- Слон
...
Рейтинг: 0 / 0
25.08.2002, 13:20:44
    #32045736
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
2 Слон

Да собственно ни в чем нет разницы. Просто, наверное, глаз замылился - показалось что ваш запрос неправильный. Как в том анекдоте - "ну значит, музыкой навеяло ..."
...
Рейтинг: 0 / 0
25.08.2002, 20:43:02
    #32045749
Слон
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
Glory,

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

-- Слон
...
Рейтинг: 0 / 0
26.08.2002, 06:37:05
    #32045771
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление из подчиненых таблиц
2 Slon

Ну вот работает!
Спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Удаление из подчиненых таблиц / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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