2012-08-21 4 views
0

Мне нужно удалить значения в таблице temp на основе обоих значений в другом. Другими словами, я не хочу item_desc осталось в B для идентификатора, который имеет style_cd указанный в А.Удалить из одной таблицы на основе двух столбцов в другой

#tempA 
style_cd char(3), 
id_cd varchar(15) 

Некоторые выборочные значения, как:

A, 123456 
A, 654321 
B, 321456 
A, 654123 
C, 424242 

.

#tempB 
item_desc varchar(50), 
item_num char(4), 
style_cd char(3), 
id_cd varchar(15) 

Примерные значения для этой таблицы:

item 1, 7, A, 123456 
item 2, 14, B, 123456 
item 2, 14, A, 123456 
item 3, 23, A, 123456 
....snip.... 
item 2, 14, B, 654321 
item 2, 14, A, 654321 
item 6, 44, A, 654321 

Например - для идентификатора 123456 Я хочу, чтобы удалить обе записи для элемента 2 из B. Каждый элемент может иметь несколько стилей, связанных с ним. У идентификатора обычно будет только один стиль, связанный с ним, но, возможно, у него есть несколько.

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

DELETE #tempB 
WHERE style_cd IN 
    (SELECT style_cd 
    FROM #tempB b JOIN tempA a 
    ON b.id_cd = a.id_cd 
    AND b.style_cd = a.style_cd) 

Конечно, это удаляет все строки, и я не могу за жизнь мне понять, как просто избавиться от только строк, связанных со значениями style_cd перечисленных для идентификатора в таблице А. Надеюсь, это имеет смысл, и кто-то может избавить меня от моих страданий !!!!

Я использую Sybase ASE 15.0.2

ADD ... я использовал @ Джонсе предложение в качестве отправной точки. Когда я проверяю выбор, он выбирает строки, которые мне нужны для этого.

SELECT a.style_cd 
    FROM #tempB b 
     JOIN #tempA a 
     ON a.id_cd = b.id_cd 
     AND a.style_cd = b.style_cd 

Когда я добавляю в любом Удалить статье он стирает все

DELETE FROM #tempB 
WHERE style_cd IN 
(SELECT style_cd 
FROM #tempB b JOIN tempA a 
ON b.id_cd = a.id_cd 
AND b.style_cd = a.style_cd) 

Как-то я не получаю только те строки из списка в поле выбора удалены из tempB

ответ

2

Это просто простой путаница между DELETE #tempDB и DELETE *FROM* #tempDB

Попробуйте тот же запрос, который был изменен следующим образом:

DELETE FROM #tempB 
WHERE style_cd IN 
    (SELECT style_cd 
    FROM #tempB b JOIN tempA a 
    ON b.id_cd = a.id_cd 
    AND b.style_cd = a.style_cd) 
+0

Я добавил, что FROM и получил те же результаты. – djailer

+0

Sybase должен иметь другой синтаксис. https://gist.github.com/3428603 - это мой тестовый файл, который я сделал в SQLite –

+0

Это странно. Я вставил это, отформатировал его для Sybase, и это сработало. Я остался с одной строкой для каждого типа B. Я вырезал и вставлял в свой фактический код и менял имена таблиц/столбцов.На этот раз он оставил меня с несколькими рядами, но не так, как я ожидал. Теперь все они имеют тот же стиль_cd, и мне нужно выяснить, что я получил по сравнению с исходным списком. Я мог бы быть ближе! – djailer

2

Попробуйте это:

DELETE FROM #tempB 
WHERE id_cd IN 
    (SELECT a.id_cd 
    FROM #tempB b, tempA a 
    where b.style_cd = a.style_cd) 
+0

Nope ... У меня было 17 пользователей, которые заказывали товары, и только один запрос выбора дал мне 3268 результатов из 209 предметов, заказанных. Все было удалено из tempB. – djailer

+0

Какие элементы не будут удаляться из вашего примера? Каждая строка имеет ключ (id_cd) от tempE до tempA, поэтому я думаю, что все будет удалено. У вас есть предложение where в вашем запросе? – Parado

+0

Я попробовал именно то, что вы предложили ... с WHERE id_cd IN ... и т. Д. В конечном итоге все элементы будут удалены. Я изменил его, чтобы он соответствовал предложению Джона ниже, но когда я его масштабировал, чтобы включить более разнообразные данные, он удалил все из tempB, у которого был style_cd, связанный с id в tempA. – djailer

0

Вот что получилось, в конце концов ...

SELECT a.style_cd, item_desc,rowindex 
    into #deltable 
    FROM #tempB b 
     JOIN #tempA a 
     ON a.id_cd = b.id_cd 
     AND a.style_cd = b.style_cd 


delete from #tempB 
where rowindex in 
(select rowindex from #deltable) 



delete from #tempB 
where item_desc in(
select b.item_desc 
from #tableB a 
join #deltable b 
on a.item_desc= b.item_desc 

Я добавил столбец идентификаторов (RowIndex) для #tempB и использовали его, чтобы сделать удаление. Я все еще должен проверить его, но до сих пор ... он работает. Спасибо за все толчки.

Смежные вопросы