Значение SQL Server NULL с внутренним соединением

Я использую С# и 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 просто игнорирует «строку» с нулевым значением; что вполне нормально по критериям.

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

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

Какие-либо предложения?

Спасибо


person Yash    schedule 27.04.2011    source источник
comment
Вам действительно нужно предоставить некоторые образцы данных с некоторыми ожидаемыми результатами. Например, если table1.EmpID имеет значение Null, какие строки для table2 должны появиться? Никто?   -  person Thomas    schedule 28.04.2011


Ответы (5)


Вам нужно сделать LEFT JOIN:

SELECT table1.id, table1.description, table2.name, table2.surname FROM table1
LEFT JOIN table2 ON table1.EmpID = table2.EmpID;
person Alan Savage    schedule 27.04.2011
comment
Закрыть, но значение table1 не обязательно должно быть нулевым, чтобы запись отображалась; он все равно будет в результатах, если нет записей table2 с этим empID. Кроме того, значения table2 всегда будут возвращаться нулевыми, вместо того, чтобы разрешать пользовательское значение, как того хотел OP. - person KeithS; 28.04.2011
comment
В исходном вопросе не говорится, что могут быть возвращены ненулевые значения, которые не имеют соответствующей записи в таблице 2. Чтобы установить значение по умолчанию, если значение равно null, вы можете использовать: SELECT table1.id, table1.description, ISNULL (table2.name, 'John'), ISNULL (table2.surname, 'Smith') FROM table1 LEFT JOIN table2 ON таблица1.EmpID = таблица2.EmpID; - person Alan Savage; 28.04.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
person KeithS    schedule 27.04.2011

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

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
person Dustin Laine    schedule 27.04.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
person Cade Roux    schedule 27.04.2011

person    schedule
comment
Это также заменит нули в существующих записях; table2.surname может иметь законное значение null, и OP только заявил, что ему нужны пользовательские значения для несуществующих записей. Кроме того, если table1.empID не равен нулю, но нет таблицы2 с этим empID, запись table1 отображается, когда OP хочет, чтобы они отображались, только если table1.empID был равен нулю. - person KeithS; 28.04.2011
comment
@KeithS - WRT для обнуления фамилий или имен, нам не сообщают, могут ли они быть обнулены. Несмотря на это, я переработал свое решение, которое учитывало бы это. - person Thomas; 28.04.2011