Выберите строки, в которых определенные записи будут удалены на основе другой таблицы - PullRequest
1 голос
/ 15 августа 2011

У меня есть следующая таблица A:

Cell1 Time1
a1    t1
a1    t2

И еще одна таблица B:

Cell2 Time2 SomeColumn2
a1    t1    c1
a1    t3    c2

Я хочу значения из таблицы B, где (Cell2, Time2) комбинация отсутствует в таблицеA as (Cell1, Time1).

например, в данном случае вывод будет:

Cell2 Time2 SomeColumn2
a1    t3    c2

Каково будет решение в TSQL или ms-access sql?

Ответы [ 3 ]

1 голос
/ 15 августа 2011
SELECT b.*
FROM TableB b
LEFT JOIN TableA a ON b.Cell2=a.Cell1 AND b.Time2=A.Time1
WHERE a.Cell1 IS NULL
1 голос
/ 15 августа 2011
select *
from TableB as TB
where not exists(select *
                 from TableA as TA
                 where TB.Cell2 = TA.Cell1 and
                       TB.Time2 = TA.Time1)

Не проверено в Microsoft Access.

0 голосов
/ 15 августа 2011

Требуемый вам реляционный оператор: antijoin .

В SQL отсутствует явный оператор соединения или тип или ключевое слово JOIN; То же самое относится и к Access (ACE, Jet, что угодно). Обратите внимание, что действительно реляционный язык В учебном пособии D используется NOT MATCHING, например, для его оператора соединения.

Разумеется, антисоединение может быть написано с использованием других операторов SQL. Наиболее часто встречающееся использование EXISTS или IN (subquery). В зависимости от данных может быть возможно использовать внешнее соединение с ограничением на ключ из внешней таблицы, проверяющего на ноль.

Лично я предпочитаю использовать EXISTS в SQL для соединения, потому что предложения объединения находятся ближе друг к другу в написанном коде и не приводят к проекции по объединенной таблице. Этот подход использовался в ответе @Mikael Eriksson.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...