Есть ли способ объединить таблицы, используя имена столбцов «как» - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь создать запрос, который объединяет 2 таблицы на основе имени и фамилии.Я успешно получил свои подстроки для разделения имен из одного столбца на 2 с именами FirstName и LastName.Это должно позволить мне сопоставить эти столбцы, чтобы они могли получить правильный добавочный номер, номер телефона, отдел и имя.Однако я делаю что-то не так здесь.Мой метод выполнения этого не работает, или он выдаст ошибку.

SELECT SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000)AS LastName, SUBSTRING(Users.Names, 1, CHARINDEX(' ', Users.Names) - 1) AS FirstName,Users.Extension, GA.[First], GA.[Last], GA.Department, GA.Phone, GA.Mobile
FROM GlobalAddress AS GA 
    Left Join Users ON GA.[First] = substring(Users.Names,1,charindex(' ',Users.Names) ) AND SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000) = Ga.[Last]
WHERE GA.[Last] IS NOT NULL
ORDER BY Users.Extension

Я думал, что могу поменять левое соединение с:

Users ON GA.[First] = FirstName AND Ga.[Last] = LastName

Но это приводит к ошибке.Неверное имя столбца «FirstName».

Пример формата, которому я следую

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Проблема в том, что первые несколько человек неправильно получают расширение и по какой-то причине их имена не разделяются.Проблема не в данных таблицы, хотя

Edit2: Пример таблицы глобальных адресов

Пример пользователей

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Итак, вы хотите создать псевдонимы для столбцов, потому что их длинное тело появляется во многих местах.CROSS APPLY может сделать это:

SELECT
    q.LastName,
    q.FirstName,
    Users.Extension, GA.[First], GA.[Last], GA.Department, GA.Phone, GA.Mobile
FROM 
Users
cross apply (select
    SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000)AS LastName,
    left(Users.Names, CHARINDEX(' ', Users.Names + ' ') - 1) AS FirstName
    )q
Right Join GlobalAddress AS GA 
    ON GA.[First] = q.FirstName 
    AND q.LastName = Ga.[Last]
WHERE GA.[Last] IS NOT NULL ORDER BY Users.Extension

Если в CROSS APPLY нет FROM, это может восприниматься как создание псевдонима для его столбцов.

0 голосов
/ 21 мая 2018

Ничего себе.Это может быть первый раз, когда я думаю, что right join - это более простой способ сделать что-то:

SELECT v.LastName, v.FirstName, u.Extension, GA.[First], GA.[Last],
       GA.Department, GA.Phone, GA.Mobile
from Users u cross apply
     (values (substring(u.Names, CHARINDEX(' ', u.Names + ' ') + 1, 8000),
              left(u.Names, CHARINDEX(' ', u.Names + ' ') - 1)
             )
     ) v(LastName, Firstname) right join
     GlobalAddress GA
     on GA.[First] = v.firstname and
        Ga.[Last] = v.lastname
where GA.[Last] is not null
order by u.Extension;

Мне интересно, действительно ли вы хотите внешнее соединение.Обратите внимание, что вы можете сделать это с помощью left join и скобок.

0 голосов
/ 21 мая 2018

Использовать исходное значение при объединении - не псевдоним

...Users ON GA.[First] = SUBSTRING(Users.Names, 1, CHARINDEX(' ', Users.Names) - 1)  ...
...