Получение значений NULL в объединенной таблице с помощью LIMIT - PullRequest
0 голосов
/ 30 апреля 2019

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

Моя цель:

Создайте запрос, который будет возвращать набор результатов, содержащий все строки в таблице demo1 с user_id = "admin" и единственную строку таблицы demo2 с user_id = "admin". Каждая строка в demo2 имеет уникальный user_id, поэтому всегда есть только одна строка с «admin», как user_id.

Однако я не хочу, чтобы данные demo2 расточительно повторялись в каждой последующей строке demo1. Я только хочу, чтобы первая строка набора результатов содержала данные demo2 как ненулевые значения. Нулевые значения для столбцов demo2 должны возвращаться только для строк 2+ в наборе результатов.

Текущий статус:

Прямо сейчас мой запрос возвращает соответствующие столбцы (все demo1 и все demo2), но все данные, возвращаемые с demo2, равны null.

Demo1:

id  user_id  product  quantity  warehouse
1   admin    phone    3         A
2   admin    desk     1         D 
3   k45      chair    5         B

Demo2:

id  user_id  employee  job   country
1   admin    james     tech  usa
2   c39      cindy     tech  spain

Запрос:

SELECT * 
from  demo1
left join  (SELECT * FROM demo2 WHERE demo2.user_id = 'X' LIMIT 1) X
on (demo1.user_id = x.user_id)
WHERE demo1.user_id = 'admin'

Обоснование:

Подзапрос LIMIT 1 был моей попыткой получить demo2 значения только для строки 1, полагая, что остальное будет null. Вместо этого все значения null.

Текущий результат:

id  user_id  product quantity warehouse id    employee  job   country
1   admin    phone   3        A         null  null      null  null
2   admin    desk    1        D         null  null      null  null

Желаемый результат:

id  user_id  product quantity warehouse id    employee  job   country
1   admin    phone   3        A         1     james     tech  usa
2   admin    desk    1        D         null  null      null  null

Я пытался заменить left join на left inner join, right join, full join, но ничего не дает желаемого результата.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вот еще один приятный подход: sqlfiddle

1 голос
/ 30 апреля 2019

Ваше объединение будет содержать ЛЮБЫЕ записи, которые удовлетворяют условию соединения для ваших двух таблиц. Там нет изменения этого.

Но вы могли бы запретить последующим записям в вашем наборе результатов отображать соответствующую demo2 запись, которая удовлетворяла условию соединения ПОСЛЕ того, как к ней присоединились:

SELECT demo1.id ,
    demo1.user_id,
    demo1.product,
    demo1.quantity,
    demo1.warehouse 
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.id END as demo2_id,    
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.employee END AS demo2_employee,  
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.job END as demo2_job,
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY demo1.user_id ORDER BY demo1.id) = 1 THEN demo2.country END as demo2_country
from  demo1
left join  demo2 
    on demo1.user_id = demo2.user_id
        AND demo2.user_id = 'X'
WHERE demo1.user_id = 'admin'

Это просто быстрая перезапись вашего исходного sql с добавлением CASE выражений.

При этом этот sql не даст результатов для demo2, поскольку demo2.user_id не может удовлетворить оба условия в этом запросе:

  1. Условие соединения demo1.user_id = demo2.user_id с предикатом where demo1.user_id = 'admin'

  2. Также удерживайте значение X.

Это либо admin, и оно удовлетворяет вашему первому условию соединения, но не соответствует вашему второму. Или это X и удовлетворяет ваше второе условие, но не ваше первое.

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