Левое объединение и использование левых полей, если левые поля пусты, в противном случае используйте правые поля - PullRequest
0 голосов
/ 06 июня 2018

Использование драйвера доступа из C #.

Я пытаюсь соединиться влево, поля справа переопределяют поля слева, но только если существуют правые поля.Пока у меня есть это, которое всегда переопределяет поле слева, потому что Col1 и Col2 слева игнорируются:

SELECT LeftAlias.PartNumber AS PartNumber, Col1, Col2, Col3
INTO TableA FROM 
(SELECT PartNumber, Col3 FROM TableA IN 'LeftFile.mdb') AS LeftAlias
LEFT JOIN
(SELECT PartNumber, Col1, Col2 FROM TableA IN 'RightFile.mdb') AS RightAlias
ON LeftAlias.PartNumber=RightAlias.PartNumber
ORDER BY LeftAlias.PartNumber;


LeftFile.TableA
PartNumber | Col1   | Col2  | Col3
-----------+--------+-------+------
123-abc    | cat    | dog   | 10
456-def    | horse  | zebra | 11
789-ghi    | ameoba | mouse | 12

RightFile.TableA
PartNumber | Col1   | Col2
-----------+--------+-----
123-abc    | lion   | hyena
456-def    | <null> | <null>

Desired output TableA
PartNumber | Col1   | Col2  | Col3
-----------+--------+-------+-------
123-abc    | lion   | hyena | 10
456-def    | horse  | zebra | 11
789-ghi    | amoeba | mouse | 12

Как получить переопределение, только если поле существует в RightFile?PartNumber, к которому я присоединяюсь, никогда не будет NULL.

1 Ответ

0 голосов
/ 06 июня 2018

Ваш запрос должен выглядеть следующим образом:

SELECT LeftAlias.PartNumber AS PartNumber, 
       IIF(ISNULL(RightAlias.Col1), LeftAlias.Col1, RightAlias.Col1) AS Col1, 
       IIF(ISNULL(RightAlias.Col2), LeftAlias.Col2, RightAlias.Col2) AS Col2, 
       LeftAlias.Col3
INTO TableA FROM 
(SELECT PartNumber, Col1, Col2, Col3 FROM TableA IN 'LeftFile.mdb') AS LeftAlias
LEFT JOIN
(SELECT PartNumber, Col1, Col2 FROM TableA IN 'RightFile.mdb') AS RightAlias
ON LeftAlias.PartNumber=RightAlias.PartNumber
ORDER BY LeftAlias.PartNumber;

IIF Функция оценивает первый параметр как выражение и возвращает второй параметр, если выражение истинно, и третий параметр, есливыражение ложное. ISNULL возвращает значение true или false в зависимости от того, передано ли значение параметра null или нет.

Обратите внимание, что при использовании Access 2007 или более поздней версии вы можете сократить эти строки:

IIF(ISNULL(RightAlias.Col1), LeftAlias.Col1, RightAlias.Col1) AS Col1, 
IIF(ISNULL(RightAlias.Col2), LeftAlias.Col2, RightAlias.Col2) AS Col2, 

С функцией Nz :

Nz(RightAlias.Col1, LeftAlias.Col1) AS Col1, 
Nz(RightAlias.Col2, LeftAlias.Col2) AS Col2, 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...