выберите, где поле не равно полю в другой таблице - PullRequest
0 голосов
/ 03 мая 2020

Я запускаю следующий скрипт в SQLite3:

drop table if exists B;
drop table if exists C;

create table B (a integer, b text, c text);

insert into B values (1, "1.1", "B");
insert into B values (1, "2.1", "B");
insert into B values (3, "3.1", "B");
insert into B values (4, "4.1", "B");
insert into B values (5, "5.1", "B");
insert into B values (6, "6.1", "B");
insert into B values (7, "7.1", "B");

create table C (a integer);

insert into C (a) values (1), (3), (5);

select * from B where B.a <> C.a;

Этот скрипт выдает ошибку при запуске:

Ошибка: около строки 30: такого столбца нет: C .a

Идея состоит в том, что я хотел бы сделать выбор из B, где поле a равно , а не равно 1, 3 или 5 Разве нельзя ссылаться на столбцы из других таблиц в том же операторе SQL? Как этого добиться?

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

a|b|c
4|"4.1"|"B"
6|"6.1"|"B"
7|"7.1"|"B"

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Это требование можно выразить с помощью NOT EXISTS следующим образом:

select * from B 
where not exists (
  select 1 from C
  where C.a = B.a
);

Для каждой строки B, если B.a не существует в C, тогда NOT EXISTS равно TRUE и этот ряд возвращается.

Или с LEFT JOIN, из которого возвращаются только несопоставленные строки B:

select B.*
from B left join C
on C.a = B.a
where C.a is null;

См. Демонстрационную версию . Результаты:

| a   | b   | c   |
| --- | --- | --- |
| 4   | 4.1 | B   |
| 6   | 6.1 | B   |
| 7   | 7.1 | B   |
1 голос
/ 03 мая 2020

SELECT * FROM B WHERE a NOT IN (SELECT DISTINCT a FROM C)

Это стандарт SQL.

NOT IN исключает все значения из выбранного набора. Набор может быть из другой таблицы, необязательно список постоянных значений.

DISTINCT не является обязательным, но он может обеспечить более быстрое выполнение в очень больших наборах.

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