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

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

-- Слон
...
Рейтинг: 0 / 0
Удаление из подчиненых таблиц
    #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
Удаление из подчиненых таблиц
    #32045691
Фотография Слон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
DELETE FROM t3
FROM t1 INNER JOIN t2 ON .... INNER JOIN t3 ON .....

-- Слон
...
Рейтинг: 0 / 0
Удаление из подчиненых таблиц
    #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
Удаление из подчиненых таблиц
    #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
Удаление из подчиненых таблиц
    #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
Удаление из подчиненых таблиц
    #32045723
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory

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

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

Именно

Удаляются все записи из Table3. Не работает! Проклятье
...
Рейтинг: 0 / 0
Удаление из подчиненых таблиц
    #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
Удаление из подчиненых таблиц
    #32045726
Almi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если столы связаны по ключевым полям один ко многим то таки так наверно:

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

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

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

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

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

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

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

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

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


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