【问题标题】:SQL Server Join Tables By Combining 2 ColumnsSQL Server 通过组合 2 列连接表
【发布时间】: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

标签: sql ms-access


【解决方案1】:

在使用多个 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

【讨论】:

  • 太棒了!我不能感谢你!我已经连续这么多小时了,讨厌寻求帮助,但是 Access 语法有很多警告,我对此一无所知。真的,非常感谢您!
  • 我确实采用了您的策略,将查询保存为 Access 对象,这真是个好主意,而且更巧妙。很好的解释,我真的从中学到了很多。
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
相关资源
最近更新 更多