2016-01-16 2 views
2

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

table1   *this table is a result of some query 
------------- ------------- 
| id1 | id2 | | id1 | id2 | 
------------- ------------- 
| 1  2 | | 5  6 | 
| 3  4 | | 1  2 | 
| 5  6 | | 11  12 | 
| 7  8 | ------------- 
| 9  10 |  
| 11  12 | 
| 13  14 | 
------------- 

Я придумал

delete from table1 
where id1 in (select id1 from (  really long query to get a second table)) 
    and id2 in (select id2 from (the same really long query to get a second table)); 

Это работает, но я чувствую, что я делаю это слишком неправильно, и не сохраняя DRY запроса.

И как вы предлагаете работать одинаково, если в таблице 1 есть дополнительная колонка, например «somecol»?

+1

Стандартный SQL позволит 'где (ID1, ID2) в (выберите ID1, ID2 из ...)' не знаю, если SQLite допускает, что слишком –

+0

, к сожалению, нет, я получаю "рядом", ": синтаксическая ошибка:", но я постараюсь запомнить эту практику. – OlehZiniak

+1

Я предлагаю вам вместо этого использовать 'EXISTS';). –

ответ

1

IMO, Вы можете использовать EXISTS подобное заявление:

DELETE FROM table1 
WHERE EXISTS (
    SELECT 1 
    FROM (<your long query>) AS dt 
    WHERE table1.id1 = dt.id1 
     AND table1.id2 = dt.id2); 

[SQL Fiddle Sample]

+0

Не могли бы вы объяснить, что означает 'select 1'? – OlehZiniak

+0

Когда вы используете инструкцию 'EXISTS', это будет верно, если в результатах есть хотя бы одна строка, а столбцы не важны, поэтому я использую колонку без названия с фиксированным значением 1, как рекомендуется;). –

1

коррелированный подзапрос с использованием EXISTS позволяет подобрать несколько столбцов:

delete 
from table1 
where exists 
(select * from 
    (
     "really long query" 
    ) as t2 
    where table1.id1 = t2.id1 -- correlating inner and outer table 
    and table1.id2 = t2.id2 -- similar to a join-condition 
) 
+0

попробовал несколько раз, внимательно наблюдая за каждой круглой скобкой и запятыми, и каждый раз, когда я получаю «рядом» как «: синтаксическая ошибка:» – OlehZiniak

+0

@OccamRazor: Вы, вероятно, не можете использовать псевдоним в SQLite, подобный этому, отредактировал мой ответ .. – dnoeth

1

Один из способов заключается в использовании with, delete и exists:

with secondtable as (
     <your query here> 
    ) 
delete from table1 
    where exists (select 1 
        from secondtable st 
        where table1.id1 = st.id1 and table1.id2 = st.id2 
       ); 
+0

Я искал что-то вроде 'with ... as ...' для моих других запросов. – OlehZiniak

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