SQL Server объединяет таблицы, объединяя 2 столбца - PullRequest
0 голосов
/ 30 сентября 2018

Это звучит до смешного просто, но я пробовал так много разных подходов.Этот запрос просто настроен странно, и я пытаюсь присоединиться к нему, но нет общего столбца, с которым я могу это сделать.Однако существует столбец LastFirst (состоит из LastName, а затем FirstName), записанный в контексте DOE, JOHN.Затем в столбцах я пытаюсь присоединиться к этому, используя только FirstName (John) и LastName (Doe).

Я на самом деле пытаюсь выбрать данные из 4 таблиц, которые все возвращают 1 строку.Эти 2 таблицы могут быть объединены:

SELECT 
    RIFQuery.*, 
    _Employee.EmployeeLastName + ', ' + _Employee.EmployeeFirstName AS EmployeeLastFirst, 
    _Employee.EmployeeTitle, _Employee.Phone As EmployeePhone, 
    _Employee.EmailAddress As EmployeeEmailAddress 
FROM 
    RIFQuery 
INNER JOIN 
    _Employee ON RIFQuery.CreatedBy = _Employee.AutoNumber 
WHERE 
    RIFQuery.Autonumber = 1

Эта таблица не имеет ничего общего, так что я, вероятно, объединю ее и оставлю пустыми столбцы:

SELECT * 
FROM tblOrganization

Это таблица, которая содержитLastName и FirstName, которые я пытаюсь объединить с RIFQuery.LastFirst:

SELECT 
    Gender As ClientGender, DOB As ClientDOB, SSN As ClientSSN
FROM 
    _Clients 
WHERE 
    _Clients.LASTNAME = left(RIFQuery.LastFirst, len(RIFQuery.LastFirst)-CHARINDEX(',', REVERSE(RIFQuery.LastFirst))) 
     AND _Clients.FIRSTNAME = ltrim(substring(RIFQuery.LastFirst, len(RIFQuery.LastFirst)-CHARINDEX(',', REVERSE(RIFQuery.LastFirst))+2, len(RIFQuery.LastFirst)))

В этом операторе WHERE код разделит столбец LastFirst и получит строку, выполнив поиск по их LastName и FirstName.Мне интересно, есть ли способ, которым я могу написать это в JOIN?В противном случае я могу, вероятно, объединить и обнулить оставшиеся столбцы, но это будет выглядеть ужасно.

ОБНОВЛЕНИЕ

Я попробовал 2 предложения здесь, и оба приведут к синтаксической ошибке.Я забыл упомянуть, что я выполняю этот код в Microsoft Access VBA и пытаюсь получить DAO.RecordSet.Мне пришлось удалить некоторые имена таблиц в операторе SELECT, чтобы избежать синтаксической ошибки, поэтому, возможно, мне следует обновить вопрос, чтобы отразить MS ACCESS, а не SQL Server, хотя только запрос является единственным чистым объектом Access, а остальныесвязанные таблицы ODBC с SQL Server.

ОБНОВЛЕНИЕ

Просто одна из тех проблем, когда я не могу спать, пока она не будет исправлена, и будет одержима, пока это не так.Если я уберу все ссылки _Employee (из операторов SELECT и JOIN), он захочет работать, но с ошибками из-за слишком малого количества параметров.Я только сейчас знаю, что это связано с _Employee.Получаю разные результаты от применения скобок и просто надеюсь, что мне повезет и я попаду в него.

Ошибка вызвана этой строкой:

INNER JOIN [_Employee] ON [_Employee].[AutoNumber] = [RIFQuery].[CreatedBy]

Я получаю эту ошибку: «Синтаксическая ошибка (отсутствует оператор) в выражении запроса».

Как видно из этогоснимок экрана: Error Screenshot

Вот мой последний запрос, с которым я играю, за исключением скобок:

str = "SELECT [RIFQuery].*, " & vbCrLf & _
"       ([_Employee].[EmployeeLastName] & ', ' & [_Employee].[EmployeeFirstName]) AS [EmployeeLastFirst], " & vbCrLf & _
"       [_Employee].[EmployeeTitle], " & vbCrLf & _
"       [_Employee].[Phone] AS [EmployeePhone], " & vbCrLf & _
"       [_Employee].[EmailAddress] AS [EmployeeEmailAddress], " & vbCrLf & _
"       [_Clients].[Gender] AS [ClientGender], " & vbCrLf & _
"       [_Clients].[DOB] AS [ClientDOB], " & vbCrLf & _
"       [_Clients].[SSN] AS [ClientSSN] " & vbCrLf & _
"FROM [_Clients] " & vbCrLf & _
"      INNER JOIN [RIFQuery] ON [RIFQuery].[LastFirst] = [_Clients].[LASTNAME] & ', ' & [_Clients].[FIRSTNAME] " & vbCrLf & _
"      INNER JOIN [_Employee] ON [_Employee].[AutoNumber] = [RIFQuery].[CreatedBy] " & vbCrLf & _
"WHERE [RIFQuery].[Autonumber] = 1;"

В целях отладки, если я удалю последние 2линии и операторы _Employee SELECT, он обработает запрос без проблем.Если у кого-то есть какие-либо идеи, просто дайте мне знать.

Я был сосредоточен на том, что заявление RIFQuery JOIN является виновником в течение долгого времени, но я обнаружил, что это просто не проблема.С учетом сказанного, эта тема была по существу решена, и я ценю помощь.

1 Ответ

0 голосов
/ 30 сентября 2018

MS Access использует немного другой синтаксис, чем SQL Server, когда речь идет об использовании более одного JOIN.Вы можете пропустить JOIN с помощью _Clients (что делает его cross join ) и переместить это условие в предложение WHERE, что сделает запрос похожим на это (и который позволит вам отобразитьокно разработки для запроса без проблем)

SELECT RIFQuery.*, 
  EmployeeLastName + ', ' + EmployeeFirstName As EmployeeLastFirst, 
  EmployeeTitle, Phone As EmployeePhone, EmailAddress As EmployeeEmailAddress, 
  Gender As ClientGender, DOB As ClientDOB, SSN As ClientSSN
FROM _Clients, RIFQuery INNER JOIN _Employee ON RIFQuery.CreatedBy = _Employee.AutoNumber
WHERE RIFQuery.LastFirst = _Clients.LASTNAME & ", " & _Clients.FIRSTNAME;

Вместо того, чтобы собирать строку запроса в VBA только для возможности изменения значения параметра, я предлагаю сохранить следующий запрос в качестве объекта Access (возможно, qryRIF):

PARAMETERS lgRIF Long;
SELECT RIFQuery.*, 
  EmployeeLastName + ', ' + EmployeeFirstName As EmployeeLastFirst, 
  EmployeeTitle, Phone As EmployeePhone, EmailAddress As EmployeeEmailAddress, 
  Gender As ClientGender, DOB As ClientDOB, SSN As ClientSSN
FROM _Clients, RIFQuery INNER JOIN _Employee ON RIFQuery.CreatedBy = _Employee.AutoNumber
WHERE RIFQuery.LastFirst = _Clients.LASTNAME & ", " & _Clients.FIRSTNAME
  AND RIFQuery.Autonumber = [lgRIF];

В своем коде VBA вы можете использовать следующий код для захвата объекта QueryDef, назначения значения параметра и открытия набора записей:

With CurrentDb.QueryDefs!qryRIF
    !lgRIF = lgRIF
    With .OpenRecordset()
        ' ... your code ...
        .Close
    End With
    .Close
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...