有条件的内部联接语句(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