una - unir dos tablas sql server
Instrucción de unión interna condicional(VBA/SQL) para generar valores múltiples (2)
Soy bastante nuevo en VBA / SQL y estoy tratando de ejecutar una unión interna condicional.
Tengo dos tablas con una columna en común ("CRM" y "CodeCRM") y me gustaría obtener una dirección de correo electrónico de la tabla 2 ("Escritorios") cuando algo se desencadena (CodeBlocage = 101) en la tabla 1 ("Flux") para agregarlo a un correo electrónico automático.
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
Todo funciona bien, excepto que debería devolver más de un valor para la dirección de correo electrónico. ¿Alguna pista?
Gracias
Hay tres palabras clave que pueden causar confusión:
SELECCIONAR en sql
SELECT determina las columnas en el conjunto de registros resultante. Si su instrucción SQL es SELECT Name, Number FROM Employees
, la parte SELECCIONAR le dice que el conjunto de registros resultante tendrá dos columnas llamadas Nombre y Número.
Seleccione Case en VBA
Select Case es una construcción de programación para condicionales. Lo usarías cuando no quieras usar un montón de declaraciones de If..ElseIf..Else, pero cualquier cosa que puedas hacer con If puedes hacer con 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
CASO en sql
La palabra clave CASE en sql es como Select Case en VBA, pero se usa en la lista de campos de una instrucción SELECT sql (para uno).
SELECT Name, CASE WHEN Number = 1 THEN ''One'' ELSE ''Two'' END MyNum FROM Employees
Si ejecuta este conjunto de registros, obtendrá dos columnas (Nombre, MiNum). El campo MyNum contendrá el texto One
cuando Número es 1 para ese registro y el texto Two
si Número es cualquier cosa menos 1.
Conjuntos de registros
Tienes etiquetas Excel y Access, así que supongo que estás usando ADO en cualquiera de ellas. Su extracto
Y = Select email from table2 Inner Join table1 on table2.Crm = table1.Crm WHERE table1.Code = 1
No hace nada, no compilaría. Supongamos que desea que una variable, Y
, contenga el correo electrónico que se devolvería si ejecutara ese enunciado 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
En este caso, tengo que crear un conjunto de registros y ejecutar ese conjunto de registros para una determinada conexión. Presumiblemente, la cláusula join y WHERE asegura que solo devolverá un registro. Pero si devuelve más, este ejemplo solo usará el correo electrónico del primer registro.
Antes de tomar el valor del campo de correo electrónico, me aseguro de que el conjunto de registros devuelva al menos un registro. Si está al principio del archivo (BOF) y al final del archivo (EOF) al mismo tiempo, eso significa que no hay registros en el conjunto de registros.
Resuelto
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