SQL-запрос, представляющий собой сочетание левого и внутреннего соединений - PullRequest
2 голосов
/ 18 июня 2011

У меня есть две таблицы:

TableA        TableB
id            id
amt           amt
idUser        idTableA

Допустим, следующие данные находятся в таблице A:

1   10  1
2   20  1
3   30  1
4   40  2
5   50  3
6   60  4
7   70  4

, а в таблице B представлены следующие данные:

1   10  1
2   20  2
3   21  2
4   51  5
5   70  7

Все поля не обнуляются.

Если я хочу узнать, какие элементы в Таблице A не имеют «ссылки» на таблицу B (через поле TableB.idTableA), я могу выполнить этот запрос:

SELECT a.id, a.amt
FROM TableA a LEFT JOIN TableB b on b.idTableA = a.id
WHERE b.idTableA IS NULL

и он вернет следующее:

3   30
4   40
6   60

, если я хочу знать, какие элементы в TableA (которые имеют ссылку на tableB) для которых значения amt не идентичны в каждой таблице Iможет сделать:

SELECT a.id, a.amt, b.amt
FROM TableA a INNER JOIN TableB b on b.idTableA = a.id
WHERE a.amt <> b.amt

и он вернется:

2   20  21
5   50  51

Теперь я хотел бы запрос, который выполняет следующее: Возвращает idUsers, для которых только некоторые их записи в TableA имеют ссылку на TableB (это означает, что для idUser также должны быть некоторые записи в TableA без ссылки между двумя таблицами) и для которых по крайней мере одна запись имеет разные суммы между двумя таблицами средистроки, которые связаны между собой.

В моем экзаменеТо есть idUser 1 будет возвращен таким запросом, потому что третья запись в TableA удовлетворяет первому условию (некоторые записи без ссылки), и существует запись, для которой суммы различаются (связанные со значением 2 для idTableA представляют собой суммы 20в Таблице A против 21 в Таблице B)

userId 2 не будет возвращен, так как он не имеет строки, связанной между двумя таблицами,

userId 3 не будет возвращен, поскольку он не имеет строки вТаблица A без ссылки в TableB

userId 4 не будет возвращена, поскольку, хотя в Таблице A есть 1 строка без ссылки, а также 1 строка со ссылкой, строка со ссылкой имеет одинаковые значения для двух таблиц.

Так что на самом деле это смесь двух начальных запросов ...

Спасибо за ваш вклад и мои извинения за базовое форматирование и язык, я надеюсь, что это достаточно ясно:)

Ответы [ 2 ]

4 голосов
/ 18 июня 2011
with loners as (
SELECT a.*
FROM TableA a 
LEFT JOIN TableB b on b.idTableA = a.id
WHERE b.idTableA IS NULL
), 
diffs as (
SELECT a.*
FROM TableA a 
INNER JOIN TableB b on b.idTableA = a.id
WHERE a.amt <> b.amt
)
select loners.userID
FROM loners
INNER JOIN diffs on LONERS.userID = DIFFS.userID
1 голос
/ 18 июня 2011
SELECT a.idUser
FROM
(SELECT a2.id, a2.amt, a2.idUser 
    FROM TableA AS a2 
    LEFT JOIN TableB AS b2 
    ON b2.idTableA = a2.id 
    WHERE b2.idTableA IS NULL
) AS a 
INNER JOIN TableB AS b
ON b.idTableA = a.id
WHERE a.amt <> b.amt;

Я не уверен, что это на самом деле более эффективно, но вот как бы я это сделал.

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