Невозможно отфильтровать строки одной таблицы на основе данных другой таблицы в PostgreSQL - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть две таблицы tbl1 (552 строки) и tbl2 (257 строк) с неравными строками в моей базе данных PostgreSQL (PG 9.5, x64 Windows). Таблицы tbl1 и tbl2 содержат следующие данные (образец показан здесь):

Grp   id   val1   val2   sum
1     1    112    142    5.2
1     2    124    137    6.7
1     3    136    189    6.8
1     4    112    114    9.8
1     5    130    145    6.1
1     6    142    130    7.7

Grp  id    sum
1    1     5.2
1    3     6.8
1    6     7.7

Для каждой группы в таблице 1 я пытаюсь выбрать строки, в которых «id» в первой таблице не равно « id "второй таблицы. Например, мой ожидаемый результат будет:

Grp   id    val1   val2   sum
1     2     124    137    6.7
1     4     112    114    9.8
1     5     130    145    6.1

Я пробовал этот запрос до сих пор, но он не работает, и возвращает пустой вывод.

SELECT
   a.grp, a.id,
   a.val1, a.val2, a.sum
FROM tbl1 a
WHERE NOT EXISTS (
    SELECT * 
    FROM tbl2 b WHERE b.grp = a.grp AND b.id != a.id
)

Может кто-то помочь по это и объясните, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Поскольку вы используете NOT EXISTS, вам нужно условие b.id = a.id, а не b.id != a.id:

...................
WHERE b.grp = a.grp AND b.id = a.id
...................
1 голос
/ 02 апреля 2020

Проблема с вашим запросом состоит в том, что предложение NOT EXISTS всегда будет возвращать false с данными, которые вы показали в образце (для каждой строки в a есть строка в b, где grp - то же самое, но id - другое) ).

A LEFT JOIN с фильтром IS NULL добьется цели:

SELECT a.grp, a.id,
    a.val1, a.val2, a.sum
FROM tbl1 a
LEFT JOIN tbl2 b ON a.grp = b.grp AND a.id = b.id
WHERE b.id IS NULL --b.id is null if there is no row in b which matches both a.grp and a.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...