Выбор результата из двух таблиц в SQL Server - PullRequest
0 голосов
/ 14 октября 2019

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

Терминал:

enter image description here

Выход:

enter image description here

vpos_out:

enter image description here

Когда я выполняю следующий запрос, все выглядит хорошо:

SELECT TOP 2
    o.id,
    mt.id AS [activated_device],
    vo.id AS [outlet]
FROM 
    terminalmt WITH (NOLOCK) 
LEFT JOIN 
    outlet o WITH (NOLOCK) ON o.id = mt.outlet_id AND  mt.status = 0
LEFT JOIN 
    vpos_out vo WITH (NOLOCK) ON vo.wallet_id = o.wallet_id AND vo.status = 1
WHERE 
    o.wallet_id = 356988

Я получаю следующий результат:

enter image description here

проблема в том, что я изменяю значение mt.status на 12 (статус, который явно не существует.

В этом случае я не получаю никаких результатов.

Я хочу получитьследующий результат

enter image description here

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Поскольку вы всегда хотите outlet записей, а остальные необязательны в зависимости от фильтрации, вам нужно начать с таблицы outlet, а затем left join с остальными.

Вот так:

SELECT TOP 2
    o.id,
    mt.id AS [activated_device],
    vo.id AS [outlet]
FROM 
    outlet o WITH (NOLOCK) 
LEFT JOIN 
    terminal mt WITH (NOLOCK) ON o.id = mt.outlet_id AND mt.status = 12
LEFT JOIN 
    vpos_out vo WITH (NOLOCK) ON vo.wallet_id = o.wallet_id AND vo.status = 1
WHERE 
    o.wallet_id = 356988

И я согласен с комментарием, сделанным о штукатурке WITH (NOLOCK) на всех столах. В основном это означает, что вы не заботитесь о точности и правильности результатов . Вы должны подумать дважды (или трижды), прежде чем использовать его.

0 голосов
/ 14 октября 2019

Я думаю, что вам нужно (обратите внимание на дополнительный термин в предложении where):

    SELECT
      TOP 2
      o.id,
     mt.id as [activated_device],
     vo.id as [outlet]
      FROM terminalmt WITH(NOLOCK) 
      LEFT JOIN outlet o WITH(NOLOCK) ON o.id = mt.outlet_id AND  mt.status = 0
      LEFT JOIN vpos_out vo WITH(NOLOCK) ON vo.wallet_id = o.wallet_id AND vo.status = 1
    WHERE o.wallet_id = 356988 OR o.id is NULL

Для обработки там, где нет строки на другой стороне соединения с таблицей розеток.

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