SQL запрос к ОБЪЕДИНЕНИЮ двух таблиц, возвращающих ноль, если не найден - PullRequest
0 голосов
/ 05 марта 2020
table: p
p_id/t_id/
1,35
2,35
3,35
4,35
5,35
6,22
7,22
...

для таблицы p, все возможные значения для p_id зарегистрированы

table: mps
p_id/m_id/value
2,1001,0
4,1001,2
7,1005,1
...

для таблицы: mps, всего несколько значений p_id было зарегистрировано.

  • Как мы можем объединить две таблицы с помощью следующего оператора?

  • the вывод должен быть: p_id, m_id и value.

  • вход : m_id (т.е. : 1001) и t_id (то есть: 35).

Он должен отображать все комбинации p_id, а когда он не находит данных в таблице mps, просто отображать ноль.

output example:
p_id, m_id, value
1,1001,null
2,1001,0
3,1001,null
4,1001,2
5,1001,null

Я пробовал с различными SQL запросами, но я не получаю вывод, когда p_id не зарегистрирован в таблице mps:

SELECT p.p_id, mps.value, mps.m_id 
FROM p LEFT JOIN
     mps
     ON p.p_id = mps.p_id 
WHERE p.t_id = 35 AND mps.m_id=1001

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Поскольку вы получите значения NULL mps для любого p_id, которого нет в mps, вам необходимо COALESCE значение m_id, чтобы оно равнялось 1001 для значений p_id не в mps:

SELECT p.p_id, COALESCE(mps.m_id, 1001) AS m_id, mps.value
FROM p 
LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = 1001
WHERE p.t_id = 35
ORDER BY p.p_id

Вывод:

p_id    m_id    value
1       1001    (null)
2       1001    0
3       1001    (null)
4       1001    2
5       1001    (null)

Демонстрация по SQLFiddle

В качестве альтернативы (чтобы не повторять значение 1001) вы можете CROSS JOIN получить производную таблицу, состоящую из m_id = 1001 и затем LEFT JOIN до mps:

SELECT p.p_id, m.m_id AS m_id, mps.value
FROM p 
CROSS JOIN (SELECT 1001 AS m_id) m
LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = m.m_id
WHERE p.t_id = 35
ORDER BY p.p_id

Вывод такой же как предыдущий запрос. Демонстрация по SQLFiddle

1 голос
/ 05 марта 2020

Я думаю, вы просто хотите переместить фильтрацию t_id в WHERE предложение:

SELECT p.p_id, mps.value, mps.m_id, 
FROM p LEFT JOIN
     mps
     ON mps.p_id = p.p_id and mps.m_id = 1001
WHERE p.t_id = 35 
0 голосов
/ 05 марта 2020

То, что вы ищете в mps.m_id, - это данные, которых иногда не существует, поэтому вы должны предоставить их сами;

SELECT p.p_id
     , 1001 AS m_id
     , mps.value
FROM p
   LEFT JOIN mps ON p.p_id = mps.p_id AND mps.m_id = 1001
WHERE p.p_id = 35;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...