有条件的内部联接语句(VBA / SQL)生成多个值

我很新的VBA / SQL,我试图执行一个条件的内部联接。

我有两个共同列的表(“CRM”和“CodeCRM”),当table1(“Flux”)触发某个事件(CodeBlocage = 101)时,我希望从table2(“服务台”)获得一个电子邮件地址以将其添加到自动电子邮件。

Dim StrDestinataire As String Select Case Strtable Case "Flux", "GAFIJOUR" Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Y As String Dim sSql As String Set cn = CurrentProject.Connection sSql = "Select AddMailCRM from Desks Inner Join Flux on Desks.CODECRM = Flux.CRM WHERE Flux.CODEBLOCAGE = '101'" Set rs = cn.Execute(sSql) If Not rs.BOF And Not rs.EOF Then Y = rs.Fields("AddMailCRM").Value End If StrDestinataire = Y cn.Close 

一切都很好,除了它应该为电子邮件地址返回多个值。 任何线索?

谢谢

有三个关键字可能会导致混淆:

在SQL中select

SELECT确定结果logging集中的列。 如果您的sql语句是SELECT Name, Number FROM Employees ,则SELECT部分​​将告诉您生成的logging集将有两个名为Name和Number的列。

在VBA中select案例

select案例是条件的编程构造。 如果您不想使用一堆If..ElseIf..Else语句,但是您可以使用Select Case,则可以使用它。

 Select Case A Case "Flux" Execute these VBA statements when the variable A = Flux Case "Capacitor" Execute these statements when A = Capacitor Case Else Execute these statements when A is neither Flux nor Capacitor End Select 

在sql中的CASE

sql中的CASE关键字就像VBA中的Select Case,但是它在SELECT sql语句的字段列表中使用(对于一个)。

 SELECT Name, CASE WHEN Number = 1 THEN 'One' ELSE 'Two' END MyNum FROM Employees 

如果你执行这个logging集,你会得到两列(Name,MyNum)。 MyNum字段将包含文本One当Number为1时该文本和文本Two如果Number是除1之外的任何内容。

logging集

你有Excel和Access标签,所以我会假设你在其中任何一个中都使用了ADO。 你的陈述

 Y = Select email from table2 Inner Join table1 on table2.Crm = table1.Crm WHERE table1.Code = 1 

什么都不做 – 它不会编译。 假设您想要一个variablesY来包含执行该sql语句时将返回的电子邮件。

 Sub GetEmail() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Y As String Dim sSql As String Set cn = New ADODB.Connection cn.Open "MyConnectionStringGoesHere" sSql = "Select email from table2 Inner Join table1 on table2.Crm = table1.Crm WHERE table1.Code = 1" Set rs = cn.Execute(sSql) If Not rs.BOF And Not rs.EOF Then Y = rs.Fields("email").Value End If End Sub 

在这种情况下,我必须创build一个logging集,并为特定的连接执行该logging集。 推测连接和WHERE子句可以确保它只返回一条logging。 但是,如果它返回更多,这个例子将只使用来自第一个logging的电子邮件。

在获取电子邮件字段的值之前,请确保logging集至less返回一条logging。 如果它同时在文件(BOF)的开头和文件(EOF)的结尾,则表示logging集中没有logging。

解决了。

 Dim StrDestinataire As String Select Case Strtable Case "Flux", "GAFIJOUR" Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim Y As String Dim sSql As String Set cn = CurrentProject.Connection sSql = "Select AddMailCRM from Desks Inner Join Flux on Desks.CODECRM = Flux.CRM WHERE Flux.CODEBLOCAGE = '101'" Set rs = cn.Execute(sSql) If Not rs.BOF And Not rs.EOF Then Y = rs.Fields("AddMailCRM").Value End If StrDestinataire = Y cn.Close