Правое соединение возвращает результаты не в том месте, где установлено

Я не понимаю, почему правильное соединение не возвращает ожидаемых результатов.

Если в условном клише указано, что возвращаются только результаты с:

R.REIN_SRT = 'A' AND R.REIN_STA = '9'

но вместо этого он возвращает все в таблице, точно так же, как нет условия where:

+----------+-------------+----------+----------+----------+
| INVE_KEY |  INVE_NME   | INVE_KEY | REIN_SRT | REIN_STA |
+----------+-------------+----------+----------+----------+
| NULL     | NULL        |        1 | S        |        1 |
| 1        | CHAIR BLACK |        1 | A        |        9 |
| NULL     | NULL        |        1 | B        |        2 |
| NULL     | NULL        |        1 | S        |        1 |
| NULL     | NULL        |        1 | S        |        1 |
| NULL     | NULL        |        1 | S        |        1 |
| NULL     | NULL        |        1 | S        |        1 |
| NULL     | NULL        |        1 | S        |        1 |
| NULL     | NULL        |        1 | S        |        1 |
+----------+-------------+----------+----------+----------+

Почему условие where не работает должным образом?

Вот полный пример:

DECLARE @JEINVE TABLE
(
INVE_KEY INT,
INVE_NME VARCHAR(100)
)

DECLARE @JEREIN TABLE
(
INVE_KEY INT,
REIN_SRT CHAR(1),
REIN_STA CHAR(1)
)

INSERT INTO @JEINVE(INVE_KEY, INVE_NME)
VALUES(1, 'CHAIR BLACK'),(2, 'WHITE TABLE'),(3, 'BLACK CANDLE')

INSERT INTO @JEREIN(INVE_KEY,REIN_SRT,REIN_STA)
VALUES(1,'S','1'),(1,'A','9'),(1,'B','2'),(1,'S','1'),(1,'S','1'),(1,'S','1'),(1,'S','1'),(1,'S','1'),(1,'S','1')

SELECT *
FROM @JEINVE INVE RIGHT JOIN @JEREIN R
ON INVE.INVE_KEY = R.INVE_KEY
AND R.REIN_SRT = 'A' AND R.REIN_STA = '9'
0
0
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Измените свой запрос:

SELECT *
FROM @JEINVE INVE 
RIGHT JOIN @JEREIN R
ON INVE.INVE_KEY = R.INVE_KEY
WHERE R.REIN_SRT = 'A' AND R.REIN_STA = '9'

Измените ваш запрос:

Существующий

AND R.REIN_SRT = 'A' AND R.REIN_STA = '9'

Новый:

WHERE R.REIN_SRT = 'A' AND R.REIN_STA = '9'

Объяснение:

Когда вы помещаете условие в "ПО СТАТЬЕ"

  • В правом соединении он рассмотрит, извлекать ли данные из ПРАВИЛЬНОЙ таблицы.

Но когда вы помещаете условие в "WHERE Clause"

  • В этом случае он будет фильтровать строки в соответствии с вашим условием.

Отсутствует ли какое-либо объяснение?

FrenkyB 10.09.2018 10:11

Доделанный ответ!

Prahalad Gaggar 10.09.2018 10:13

Это действительно интересно - с этим: ON INVE.INVE_KEY = R.INVE_KEY AND R.REIN_SRT = 'A' - похоже, что все после AND не является частью условия.

FrenkyB 10.09.2018 10:18

Другие вопросы по теме