Left Join не получает значение NULL для условного поля - PullRequest
1 голос
/ 19 августа 2011

Я пытался извлечь значение из двух таблиц путем объединения, но несколько значений во вторых столбцах отсутствуют.

например

valuetable

----------------------
| id |orderid| prodid|
----------------------
|  1 |  NULL |      4|
----------------------
|  1 |     A |      4|
----------------------
|  2 |  NULL |      4|
----------------------
|  2 |  NULL |      3|
----------------------
|  3 |     B |      4|
----------------------
|  3 |     B |      3|
----------------------
|  3 |     B |      5|
----------------------

Nametable

--------------
| id |   Name|
--------------
|  1 |  Apple|
--------------
|  2 |   Ball|
--------------
|  3 |    Cat|
--------------
|  4 |    Dog|
--------------

У меня есть две таблицы выше.Я должен получить значения в следующем формате.

Результат запроса

----------------------
| id |   Name|orderid|
----------------------
|  1 |  Apple|  NULL |
----------------------
|  2 |   Ball|  NULL |
----------------------
|  3 |    Cat|     B |
----------------------
|  4 |    Dog|  NULL |
----------------------

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

SELECT  nt.id, nt.[Name]
    , MIN(vt.orderid) AS orderid
FROM   Nametable nt  LEFT OUTER JOIN valuetable vt 
ON nt.id = vt.id
WHERE 
    vt.prodid = 3
GROUP BY
    nt.id, nt.[Name]

, но пропустил строку | 1 | Apple| NULL |.Как я могу получить это?используя MSSQL Server 2005

UPDATE

таблица значений не имеет значения идентификатора 1 для prodid = 3, но мне нужен результат вышеупомянутым способом.означает, что если он не может получить идентификатор из таблицы значений для соответствующего продукта, он все равно должен получить идентификатор и его имя со значением NULL в качестве orderid.

Ответы [ 3 ]

3 голосов
/ 19 августа 2011

Кажется, у вас есть

WHERE vt.prodid = 3
Значение

не содержит Apple с продом = 3

Таким образом, вы не должны иметь в предложении where, а в предложении соединения:

SELECT  nt.id, nt.[Name]
, MIN(vt.orderid) AS orderid
FROM   Nametable nt  LEFT OUTER JOIN valuetable vt 
ON nt.id = vt.id AND vt.prodid = 3
GROUP BY
  nt.id, nt.[Name]
0 голосов
/ 19 августа 2011

проблема, по-видимому, связана с вашим положением where, так как вы выполняете левое соединение, vt.Prod_id может быть нулевым (и, следовательно, не равно 3).

Если вам нужны все записи Nametable (например, все имена иnull, если продукт не сопоставлен) для продукта с идентификатором 3 (даже если нет записи) вы можете попробовать:

SELECT  nt.id, nt.[Name]
    , MIN(vt.orderid) AS orderid
FROM   Nametable nt  LEFT OUTER JOIN valuetable vt 
ON nt.id = vt.id
WHERE 
    (vt.prodid is null or vt.prodid = 3)
GROUP BY
    nt.id, nt.[Name]
0 голосов
/ 19 августа 2011

нулевое значение будет игнорироваться, поскольку вы используете агрегатную функцию (MIN ()). если вы выводите результаты в виде текста, вы должны увидеть это предупреждение. также ваш пример запроса имел выражение vt.prodid = 3, где, очевидно, исключил бы строку, которую вы ищете

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