Sql COALESCE целые строки? - PullRequest
       17

Sql COALESCE целые строки?

5 голосов
/ 14 сентября 2011

Я только что узнал о COALESCE, и мне интересно, можно ли COALESCE целую строку данных между двумя таблицами?Если нет, каков наилучший подход к следующим наброскам?

Например, у меня есть эти две таблицы и предполагается, что все столбцы совпадают:

tbl_Employees

Id     Name     Email     Etc
-----------------------------------
1      Sue      ...       ...  
2      Rick     ...       ...  

tbl_Customers

Id     Name     Email     Etc
-----------------------------------
1      Bob      ...       ...  
2      Dan      ...       ...  
3      Mary     ...       ... 

И таблица с идентификаторами:

tbl_PeopleInCompany

Id     CompanyId 
-----------------
1      1
2      1
3      1

АЯ хочу запросить данные таким образом, чтобы получить строки из первой таблицы с соответствующими идентификаторами, но получить из второй таблицы, если идентификатор не найден.

Таким образом, результирующий запрос будет выглядеть следующим образом:

Id     Name     Email     Etc
-----------------------------------
1      Sue      ...       ...  
2      Rick     ...       ...  
3      Mary     ...       ... 

Где Сью и Рик были взяты с первого стола, а Мэри - со второго.

Ответы [ 4 ]

7 голосов
/ 14 сентября 2011
 SELECT Id, Name, Email, Etc FROM tbl_Employees
      WHERE Id IN (SELECT ID From tbl_PeopleInID)
 UNION ALL
 SELECT Id, Name, Email, Etc FROM tbl_Customers
      WHERE Id IN (SELECT ID From tbl_PeopleInID) AND
            Id NOT IN (SELECT Id FROM tbl_Employees)

В зависимости от количества строк, есть несколько разных способов написания этих запросов (с JOIN и EXISTS), но попробуйте сначала.

Этот запрос сначала выбирает всех людей из tbl_Employees, которыеиметь значение Id в вашем списке целей (таблица tbl_PeopleInID).Затем добавляет к «основанию» этой группы строк результаты второго запроса.Второй запрос получает все строки tbl_Customer с идентификаторами в вашем целевом списке , но исключая любые с идентификаторами, которые появляются в tbl_Employees.

В общем списке содержатся нужные вам люди - все идентификаторы из tbl_PeopleInID с предпочтениемпередано Сотрудникам, но недостающие записи получены от Клиентов.

3 голосов
/ 14 сентября 2011

Вы также можете сделать это:

1) Внешнее Соедините две таблицы в tbl_Employees.Id = tbl_Customers.Id.Это даст вам все строки из tbl_Employees и оставит столбцы tbl_Customers пустыми, если нет подходящей строки.

2) Используйте CASE WHEN, чтобы выбрать либо столбец tbl_Employees, либо столбец tbl_Customers, основываясь на том, является ли tbl_Customers.Id ISNULL, например:

CASE WHEN tbl_Customers.Id IS NULL THEN tbl_Employees.Name ELSE tbl_Customers.Name END AS Name

(мой синтаксис там может быть не идеальным, но техника надежна).

0 голосов
/ 14 сентября 2011

Это должно быть довольно производительным.Он использует CTE для создания небольшой таблицы клиентов, у которых нет соответствующих записей о сотрудниках, а затем просто UNION s, которые приводят к записям о сотрудниках

;WITH FilteredCustomers (Id, Name, Email, Etc)
AS
(
    SELECT  Id, Name, Email, Etc
    FROM    tbl_Customers C
            INNER JOIN tbl_PeopleInCompany PIC
            ON C.Id = PIC.Id
            LEFT JOIN tbl_Employees E
            ON C.Id = E.Id
    WHERE   E.Id IS NULL
)

SELECT  Id, Name, Email, Etc
FROM    tbl_Employees E
        INNER JOIN tbl_PeopleInCompany PIC
        ON C.Id = PIC.Id

UNION

SELECT  Id, Name, Email, Etc
FROM    FilteredCustomers

Использование оператора IN может бытьСкорее, это требует больших запросов, поскольку может потребоваться оценить подзапрос для каждой обрабатываемой записи.

0 голосов
/ 14 сентября 2011

Я не думаю, что функция COALESCE может использоваться для того, что вы думаете.COALESCE аналогичен ISNULL, за исключением того, что позволяет передавать в несколько столбцов и возвращает первое ненулевое значение:

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product

В этой статье следует объяснить его применение

http://msdn.microsoft.com/en-us/library/ms190349.aspx

Похоже, что ответ Ларри Люстига больше соответствует тому, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...