SQL Server通过合并2列联接表

时间:2018-09-30 06:30:42

标签: sql ms-access

这听起来很简单,但是我尝试了许多不同的方法。这个查询设置得很奇怪,我试图加入它,但是没有通用的列可以使用。但是,在DOE,JOHN的上下文中编写了一个LastFirst列(由LastName和FirstName组成)。然后,在各列中,我尝试将其仅用作FirstName(John)和LastName(Doe)。

我实际上是在尝试从4个都返回1行的表中选择数据。这两个表可以连接:

month()

这个没有任何关系,所以我很可能将它合并,并使剩余的列为空:

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

这是包含要与RIFQuery.LastFirst联接的姓氏和名字的表:

SELECT * 
FROM tblOrganization

在该WHERE语句中,代码将拆分LastFirst列,并通过搜索其LastName和FirstName获得行。我想知道是否可以将其写入JOIN?否则,我可能可以使用UNION并使其余的列为空,但是它将看起来非常难看。

更新

我从这里尝试了2条建议,均导致语法错误。我忘了提及我在Microsoft Access VBA中执行此代码并尝试检索DAO.RecordSet。我必须删除SELECT语句中的一些表名才能克服那里的语法错误,所以也许我应该更新问题以反映MS ACCESS而不是SQL Server,尽管只有查询是唯一的纯Access对象,其余的都是将ODBC表链接到SQL Server。

更新

只是其中的一个问题,直到问题解决,我才能入睡,直到问题解决为止,我都会沉迷。如果我从SELECT和JOIN语句中取出所有_Employee引用,则它想工作,但参数太少会出错。我现在知道这与_Employee有关。通过应用括号获得不同的结果,只是希望我能走运并付诸实践。

该错误是由以下行引起的:

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)))

我收到此错误: “查询表达式中的语法错误(缺少运算符)”。

如该屏幕截图所示: Error Screenshot

这是我正在使用的最新查询,减去括号:

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

出于调试目的,如果我删除了最后两行和_Employee SELECT语句,它将毫无疑问地处理查询。如果有人有任何想法,请告诉我。

我一直把注意力集中在使RIFQuery JOIN语句成为最长原因的元凶上,但是我发现根本不再是问题了。话虽如此,该线程已基本解决,感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

在使用多个JOIN时,MS Access使用的语法与SQL Server略有不同。您可以使用_Clients忽略JOIN(将其设为 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;

我建议不要将以下查询另存为Access对象(也许是qryRIF),而不是为了能够更改参数值而在VBA中组装查询字符串:

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