2013-04-08 9 views
7

У меня есть две таблицы в SQL Server 2008, и, делая JOIN, я хочу получить все значения, однако я получаю только значения, в которых существуют записи, хотя мне нужны поля с NULL-записями.Возвращайте все значения, включая NULL

Вот пример того, как tableA выглядит

|IPAddress |DNSRecord| 
|192.168.1.1|Test  | 
|192.168.0.1|Test1 | 

tableB хранит следующие записи

|NetworkAddress|SerialNo | 
|192.168.1.1 |1Z5A789DS| 
|192.168.0.1 |NULL  | 

Мой запрос, чтобы вернуть поля мне нужно следующая

SELECT 
    t1.IPAddress, 
    t1.DNSRecord, 
    t2.SerialNo, 
    t2.IPAddress 
FROM tableA t1 
JOIN tableB t2 ON t1.IPAddress = t2.NetworkAddress 
WHERE 
    IPAddress LIKE '%' [email protected] + '%' 
    AND SerialNo LIKE '%' [email protected] +'%' 

Проблема с этим запросом заключается в том, что я получаю следующее resu л

|IPAddress |DNSRecord|SerialNo | 
|192.168.1.1|Test  |1Z5A789DS| 

И я хотел бы получить вернулся следующий результат вместо

|IPAddress |DNSRecord|SerialNo | 
|192.168.1.1|Test  |1Z5A789DS| 
|192.168.0.1|Test1 |NULL  | 

ответ

10

Просто добавьте условие для случая SerialNo NULL. С вашего фактического состояния, этот случай отклоняется от выбора

SELECT t1.IPAddress, 
t1.DNSRecord, 
t2.SerialNo, 
t2.IPAddress 
FROM tableA t1 
JOIN tableB t2 ON t1.IPAddress = t2.NetworkAddress 
WHERE 
IPAddress LIKE '%' [email protected] + '%' 
AND (SerialNo LIKE '%' [email protected] +'%' OR SerialNo is NULL) 
+0

Awesome: D он работает :) через 8 минут я его принимаю :) Я пробовал это раньше, но без скобок и он не работал :) Большое спасибо за помощь :) – Farkiba

+1

счастливы помочь, скобки заключают два условия OR. И результат OR оценивается и применяется в глобальном состоянии AND. – bAN

1

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

SELECT t1.IPAddress, 
t1.DNSRecord, 
t2.SerialNo, 
t2.IPAddress 
FROM tableA t1 
FULL OUTER JOIN tableB t2 ON t1.IPAddress = t2.NetworkAddress 
WHERE 
IPAddress LIKE '%' [email protected] + '%' 
AND SerialNo LIKE '%' [email protected] +'%' 

Смотрите: OUTER JOIN

Приветствия.

+0

По какой-то причине он все еще дает мне тот же результат, спасибо за ваше время :) – Farkiba

1

Попробуйте

SELECT t1.IPAddress, 
t1.DNSRecord, 
t2.SerialNo, 
t2.IPAddress 
FROM tableA t1 
JOIN tableB t2 ON t1.IPAddress = t2.NetworkAddress 
WHERE 
IPAddress LIKE '%' [email protected] + '%' 
AND (SerialNo LIKE '%' [email protected] +'%' OR SerialNo IS NULL) 
3

одна альтернатива:

SELECT t1.IPAddress, 
t1.DNSRecord, 
t2.SerialNo, 
t2.IPAddress 
FROM tableA t1 
JOIN tableB t2 ON t1.IPAddress = t2.NetworkAddress 
WHERE 
IPAddress LIKE '%' [email protected] + '%' 
AND coalesce(SerialNo, @SerialNo) LIKE '%' [email protected] +'%' 
Смежные вопросы