Используйте внешнее соединение между Source1
и Source2
.
Спецификация немного свободная. Вы хотите, чтобы Column2
от Source2
был возвращен как отдельный (третий) столбец, или вы хотите, чтобы значение было от этого во втором столбце, заменив «пустое» значение Column2
с Source1
?
Каковы типы данных Column2
в Source1
и Source2
? Это тип символа, числовой, дата-время?
Как вы определяете "empty"? Для типов символов это включает как значения NULL, так и строки с нулевой длиной?
Кроме того, какова сила отношения между таблицами, это одно к одному, от одного до многих (каким образом). Является ли это обязательным, или, возможно, один к нулю?
Предполагая, что вы хотите всех строк (если есть несколько строк из Source2
, которые соответствуют строкам из Source1
, и если вы хотите, третий столбец, и предполагая, что тип данные Column2
является характером, и при условии " пустой»означает NULL или строка нулевой длины (это много предположений) ... потом что-то вроде этого:.
SELECT s.column1
, s.column2
, IF(IFNULL(s.column2,'')='',t.column2,'') AS t_column2
FROM source1 s
LEFT
JOIN source2 t
ON t.column1 = s.column1
AND IFNULL(s.column2,'') = ''
ORDER BY s.column1, 2, 3
... будет возвращать результат, который соответствует спецификации этот запрос может быть изменен/настраивается на более жесткую (точнее) спецификацию ication.
EDIT
по электронной почте Ой.
Примерный пример, основанный на еще одном предположении: это было специфично для MySQL.
Синтаксис вышеприведенного утверждения не будет «работать» в других базах данных. Вот эквивалентное утверждение, используя более ANSI-совместимый со стандартами синтаксиса:
SELECT s.column1
, s.column2
, CASE WHEN s.column2 IS NULL OR s.column2 = ''
THEN t.column2
ELSE ''
END AS t_column2
FROM source1 s
LEFT
JOIN source2 t
ON t.column1 = s.column1
AND (s.column2 IS NULL OR s.column2 = '')
ORDER BY s.column1, s.column2
Followup
Добавлена примером, который демонстрирует поведение:
SQL Fiddle here: http://sqlfiddle.com/#!9/113e6/1
таблицы Настройки и примеры строк:
CREATE TABLE source1
(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
, column1 INT
, column2 VARCHAR(8)
);
CREATE TABLE source2
(id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY
, column1 INT
, column2 VARCHAR(8)
);
INSERT INTO source1 (id, column1, column2) VALUES
(1,NULL,NULL)
,(2,NULL,'foo')
,(3,113,'fee')
,(4,114,'fi')
,(5,115,'')
,(6,116,NULL)
,(7,122,'fo')
,(8,122,'fum')
;
INSERT INTO source2 (id, column1, column2) VALUES
(21,NULL,'doh')
,(22,113,'rey')
,(23,113,'mii')
,(24,114,'fah')
,(25,115,'sew')
,(26,115,'lah')
,(27,116,NULL)
,(28,116,'')
,(29,116,'tea')
,(30,116,'doh')
;
Пример запроса (такой же, как запрос выше):
SELECT s.column1
, s.column2
, IF(IFNULL(s.column2,'')='',t.column2,'') AS t_column2
FROM source1 s
LEFT
JOIN source2 t
ON t.column1 = s.column1
AND IFNULL(s.column2,'') = ''
ORDER BY s.column1, 2, 3
Пример запроса - такие же, как запрос выше, плюс дополнительных столбцов идентификаторов
SELECT s.column1
, s.column2
, IF(IFNULL(s.column2,'')='',t.column2,'') AS t_column2
-- ---------------
, s.id AS s_id
, t.id AS t_id
-- ---------------
FROM source1 s
LEFT
JOIN source2 t
ON t.column1 = s.column1
AND IFNULL(s.column2,'') = ''
ORDER BY s.column1, 2, 3
Возвращает:
column1 column2 t_column2 s_id t_id
------- ------- --------- ------ --------
(NULL) (NULL) (NULL) 1 (NULL)
(NULL) foo 2 (NULL)
113 fee 3 (NULL)
114 fi 4 (NULL)
115 lah 5 26
115 sew 5 25
116 (NULL) (NULL) 6 27
116 (NULL) 6 28
116 (NULL) doh 6 30
116 (NULL) tea 6 29
122 fo 7 (NULL)
122 fum 8 (NULL)
Обратите внимание, что этот пример включает «повторяющиеся» значения в столбце 1, как source1
, так и source2
, и показывает результаты, которые возвращаются. (Столбцы s_id
и t_id
включены, чтобы помочь в расшифровке возвращаемых строк.)
Какой колодец SQL мы говорим? Как правило, вы можете выполнить 'LEFT OUTER JOIN', чтобы выполнить то, что вы ищете. – willaien