2015-07-01 2 views
2

У меня есть сценарий, как показано ниже:Условный Регистрация SQL Server

source1

Column1 
Column2 

Source2

Column1 
Column2 

Выход - мне нужен вид;

Все записи в Source1, где Column2 не пуст, должны быть в представлении.

Все записи в Source1, где Column2 пуст, должны быть соединены с Source2 (в столбце 1, ссылка между обеими таблицами). Где бы он ни находил совпадение, Column2 of Source2 также должен быть включен в представление.

Любые указатели пожалуйста ..

+0

Какой колодец SQL мы говорим? Как правило, вы можете выполнить 'LEFT OUTER JOIN', чтобы выполнить то, что вы ищете. – willaien

ответ

1

Самый простой способ я вижу, с объединением обоих запросов:

SELECT * FROM Source1 WHERE Column2 IS NOT NULL 
UNION 
SELECT S2.* FROM Source1 S1 
INNER JOIN Source2 S2 
ON S1.Column1 = S2.Column1 
WHERE S1.Column2 IS NULL 
1

Подведем итоги: только включают в себя линии, где населённые Source1.Column2, и включают в себя COLUMN2 источника2, если это также заселено?

Что вы ищете, это LEFT JOIN. Изучите его и любите, потому что это одна из самых удобных вещей во всем SQL.

SELECT s1.Column1, s1.Column2, s2.Column2 
    FROM source1 s1 
LEFT JOIN source2 s2 ON s1.Column1 = s2.Column1 
    WHERE s1.Column2 IS NOT NULL 
1

Используйте внешнее соединение между 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 включены, чтобы помочь в расшифровке возвращаемых строк.)

Смежные вопросы