【发布时间】:2018-09-30 19:18:10
【问题描述】:
这听起来非常简单,但我尝试了很多不同的方法。这个查询的设置很奇怪,我正在尝试加入它,但没有一个通用的列可以做到这一点。但是,在 DOE、JOHN 的上下文中写入了 LastFirst 列(由 LastName 和 FirstName 组成)。然后在我试图加入的列上,它只是名字(John)和姓氏(Doe)。
我实际上是在尝试从 4 个表中选择数据,这些表都返回 1 行。这两个表可以连接:
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
这是包含我尝试使用 RIFQuery.LastFirst 加入的 LastName 和 FirstName 的表:
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?否则我可能会 UNION 并将剩余的列设为空,但它看起来很丑。
更新
我从这里尝试了 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]
我收到此错误: “查询表达式中的语法错误(缺少运算符)”。
这是我正在使用的最新查询,减去括号:
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;"
出于调试目的,如果我删除最后两行和 _Employee SELECT 语句,它将毫无问题地处理查询。如果有人有任何想法,请告诉我。
我一直关注 RIFQuery JOIN 语句是罪魁祸首,但我发现这不再是问题所在。话虽如此,该线程已基本解决,感谢您的帮助。
【问题讨论】:
-
将两个单独的列连接在一起进行连接可能要容易得多,而不是拆分 LastFirst 列,例如
SELECT ... FROM _Clients LEFT JOIN RIFQuery ON RIFQuery.LastFirst = CONCAT(_Clients.LASTNAME, ', ', _Clients.FIRSTNAME) -
我认为这肯定会起作用,但它给出了语法错误。我已经更新了上面的问题。
-
抱歉,我只看到了 SQL Server 标签,没有看到 MS Access。 Access 中的连接运算符是
&,因此您需要执行类似ON RIFQuery.LastFirst = _Clients.LASTNAME & ', ' &_Clients.FIRSTNAME的操作 -
我的错,我本来应该指定的。不幸的是,这仍然会引发语法错误。我注意到 &_Clients 缺少一个空格,所以我用空格 (& _Clients) 尝试了它,但仍然是同样的错误。还在玩。
-
我认为您在联接中缺少括号。在您需要开始添加括号以使其语法有效之前,Access 只允许一个连接。更多详情请见this answer