Значение NULL в SQL Server с внутренним объединением - PullRequest
3 голосов
/ 28 апреля 2011

Я использую C # и SQL Server.

Взгляните на следующий SQL:

SELECT table1.id, table1.description, table2.name, table2.surname 
FROM table1 
    INNER JOIN table2 ON table1.EmpID = table2.EmpID

Это прямо и отлично работает. Он получает данные из таблицы table1 очень хорошо, и внутренние соединения table1.empid к table2.name и table2.surname корректно.

Теперь иногда table1.empid имеет значение null, а когда это так, этот SQL просто игнорирует "строку" со значением NULL; что вполне нормально, исходя из критериев.

Мне нужно также получить «строки» со значениями NULL, а когда значение table1.empid равно NULL, мне нужно установить пользовательское значение на table2.name и table2.surname.

Я играл с isnull (), но все, что я сделал, это сделал его еще хуже.

Есть предложения?

Спасибо

Ответы [ 5 ]

10 голосов
/ 28 апреля 2011

Вам нужно сделать левое соединение:

SELECT table1.id, table1.description, table2.name, table2.surname FROM table1
LEFT JOIN table2 ON table1.EmpID = table2.EmpID;
0 голосов
/ 28 апреля 2011
SELECT table1.id
       ,table1.description
       ,COALESCE(table2.name, 'DEFAULT') AS name
       ,COALESCE(table2.surname, 'DEFAULT') AS surname
FROM table1 
LEFT JOIN table2
    ON table1.EmpID = table2.EmpID

Теперь обратите внимание, что это также будет включать людей, когда EmpID не нулевой, но тем не менее "недействительный", если у них есть EmpID в таблице 1, но он не найден в таблице 2, поэтому, если вы этого хотите избежать, другой опция такая:

SELECT table1.id
       ,table1.description
       ,table2.name
       ,table2.surname
FROM table1 
INNER JOIN table2
    ON table1.EmpID = table2.EmpID

UNION ALL

SELECT table1.id
       ,table1.description
       ,'DEFAULT' AS name
       ,'DEFAULT' AS surname
FROM table1 
WHERE table1.EmpID IS NULL
0 голосов
/ 28 апреля 2011

Если таблица 1 пуста и вам все еще нужны записи, которые вы не можете начать с этого. Начните с table2 и присоединитесь к table1.

SELECT table1.id, table1.description, ISNULL(table1.empid, "some new value") AS name, table2.surname 
FROM table2 
    LEFT OUTER JOIN table1 ON table2.EmpID = table1.EmpID
0 голосов
/ 28 апреля 2011
Select table1.id table1.description
    , Case When table1.EmpID Is Null Then 'Some Value' Else table2.name End As Table2Name
    , Case When table1.EmpID Is Null Then 'Some Value' Else table2.surname End As Table2Surname
From table1
    Left Join table2
        On table2.EmpID = table1.EmpID
Where table1.EmpID Is Null
        Or table2.EmpID Is Not Null
0 голосов
/ 28 апреля 2011

Попробуйте использовать UNION:

SELECT table1.id, table1.description, table2.name, table2.surname 
FROM table1 
INNER JOIN table2 ON table1.EmpID = table2.EmpID
UNION
SELECT table1.id, table1.description, 'Table 2 Null', 'Table 2 Null'
FROM table1
WHERE table1.empId is null
...