none
INNER JOIN con varios campos AND ON RRS feed

  • Pregunta

  • Hola

    Alguien me puede ayudar por favor?

    La siguiente consulta no me funciona.
    Si solo uso por ejemplo ON tborders.ordercussupcode = tbcertificates.certificatesupplier entonces SÍ me funcuiona

    pero cuando hay varios AND ON entonces falla (AND ON tborders.orderbatchnumber = tbcertificates.certificatebatch AND ON tbcertificates.certificateed IS NOT NULL )

    SELECT * 
    FROM tborders
    INNER JOIN tbcertificates ON tborders.ordercussupcode = tbcertificates.certificatesupplier 
    AND ON tborders.orderbatchnumber = tbcertificates.certificatebatch 
    AND ON tbcertificates.certificateed IS NOT NULL 
    WHERE tborders.orderquantityinstock > 0.00001 
    ORDER BY tborders.orderproductcode





    • Editado José De Alva martes, 7 de junio de 2016 15:21 bloque de codigo
    lunes, 6 de junio de 2016 22:15

Respuestas

  • jorge1.6.4.4,

    De acuerdo, entonces lo único que deberá cambiar es la combinación de la forma INNER JOIN a LEFT JOIN, de manera que los resultados devuelvan todos los registros de la tabla [TBORDERS] tengan o no correspondencia con la tabla [TBCertificates]

    SELECT 
    	* 
    FROM 
    	tborders 
    	LEFT JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tbcertificates.certificateed IS NOT NULL)
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    En la consulta anterior a agregado una condicional y además condiciona la columna [certificateed] por la no existencia de caracteres de espacio vacío que es muy distinto a NULL:

    SELECT 
    	* 
    FROM 
    	tborders 
    	LEFT JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tborders.orderproductcode = tbcertificates.certificateproductcode)
    		AND (tbcertificates.certificateed IS NOT NULL OR LTRIM(RTRIM(tbcertificates.certificateed)) <> '')
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    martes, 7 de junio de 2016 15:05

Todas las respuestas

  • creo que la sintaxis correcta es:

    SELECT *
    FROM tborders
    INNER JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier
    AND tborders.orderbatchnumber = tbcertificates.certificatebatch
    AND tbcertificates.certificateed IS NOT NULL)
    WHERE tborders.orderquantityinstock > 0.00001 ORDER BY tborders.orderproductcode

    los parentesis hacen la diferencia

    Saludos

    lunes, 6 de junio de 2016 22:24
  • jorge1.6.4.4,

    Comete un error en la escritura del código y es por usar la instrucción ON antes de cada expresión condicional. ON especifica la condición en la que se basa la combinación y debe indicarla una sola vez por cada combinación:

    SELECT 
    	* 
    FROM 
    	tborders 
    	INNER JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tbcertificates.certificateed IS NOT NULL)
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    • Propuesto como respuesta José De Alva martes, 7 de junio de 2016 15:22
    martes, 7 de junio de 2016 2:26
  •    

    Hola William,

    Te confirmo que tu funcion de arriba funciona. Gracias.

    Yo me debí explicar mal. Puesto que solo me lista los productos si los encuentra en las 2 tablas. Y yo quiero que liste todos lo que hay en tborders WHERE (tborders.orderquantityinstock > 0.00001)



    Te explico lo que quiero:
    tengo 2 tablas 
    - tborders
    - tbcertificates

    Antes tenia 2 consultas pero va muy muy lento. lo que quiero hacer es listar todos los productos de la tborders que tengo en stock   tborders WHERE (tborders.orderquantityinstock > 0.00001)

    y para cada producto he de buscar en la tbcertificates su certificado de analisis.

    Ahora mismo lo tengo asi pero es super super lento

    Set rs1 = ConData.Execute("SELECT * FROM tborders WHERE orderquantityinstock > 0.00001 ")
    Set rs1 = Server.CreateObject("adodb.RecordSet")
    rs1.Open ssqlrs,ConData,3,3
    Do While Not rs1.EOF

    Response.Write "<br>"
    Response.Write rs1("NombreDelProducto")

    Set rs2 = ConData.Execute("SELECT * FROM tbcertificates WHERE certificatesupplier = '"&rs1("ordercussupcode")&"' AND certificateproductcode = '"&rs1("orderproductcode")&"' AND certificatebatch = '"&rs1("orderbatchnumber")&"' AND certificateed <> '' ")
    If Not rs2.EOF Then
    Response.Write rs2("NUmeroCertificadoDeAnalisis")
    End If
    rs2.Close
    Set rs2 = Nothing

    rs1.MoveNext
    Loop
    rs1.Close


    martes, 7 de junio de 2016 14:32
  • jorge1.6.4.4,

    De acuerdo, entonces lo único que deberá cambiar es la combinación de la forma INNER JOIN a LEFT JOIN, de manera que los resultados devuelvan todos los registros de la tabla [TBORDERS] tengan o no correspondencia con la tabla [TBCertificates]

    SELECT 
    	* 
    FROM 
    	tborders 
    	LEFT JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tbcertificates.certificateed IS NOT NULL)
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    En la consulta anterior a agregado una condicional y además condiciona la columna [certificateed] por la no existencia de caracteres de espacio vacío que es muy distinto a NULL:

    SELECT 
    	* 
    FROM 
    	tborders 
    	LEFT JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tborders.orderproductcode = tbcertificates.certificateproductcode)
    		AND (tbcertificates.certificateed IS NOT NULL OR LTRIM(RTRIM(tbcertificates.certificateed)) <> '')
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    martes, 7 de junio de 2016 15:05
  • Eres un genio Willams!
    martes, 7 de junio de 2016 19:35
  • jorge1.6.4.4,

    De acuerdo, entonces lo único que deberá cambiar es la combinación de la forma INNER JOIN a LEFT JOIN, de manera que los resultados devuelvan todos los registros de la tabla [TBORDERS] tengan o no correspondencia con la tabla [TBCertificates]

    SELECT 
    	* 
    FROM 
    	tborders 
    	LEFT JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tbcertificates.certificateed IS NOT NULL)
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    En la consulta anterior a agregado una condicional y además condiciona la columna [certificateed] por la no existencia de caracteres de espacio vacío que es muy distinto a NULL:

    SELECT 
    	* 
    FROM 
    	tborders 
    	LEFT JOIN tbcertificates ON (tborders.ordercussupcode = tbcertificates.certificatesupplier)
    		AND (tborders.orderbatchnumber = tbcertificates.certificatebatch)
    		AND (tborders.orderproductcode = tbcertificates.certificateproductcode)
    		AND (tbcertificates.certificateed IS NOT NULL OR LTRIM(RTRIM(tbcertificates.certificateed)) <> '')
    WHERE 
    	(tborders.orderquantityinstock > 0.00001)
    ORDER BY 
    	tborders.orderproductcode

    Hola William
    Tengo una consulta a continuación y me esta realentizando mucho. Se podría hacer un INNER JOIN o algo similar en la anterior.

    Como veras la consulta vuelve a "atacar" a la misma tabla (tborders ). La consulta que tengo es la siguiente:
       Set rs2 = ConData.Execute("SELECT * FROM tborders WHERE orderkind = 'fc' AND orderinternalcode = '"&rs1("orderinternalcode")&"' AND orderproductcode = '"&rs1("orderproductcode")&"' ")
       If Not rs2.EOF Then
        If rs2("orderexchangecurrency") = "EUR" Then
         Response.Write "1"
         ValorDua = rs2("orderquantity")*rs2("orderitemprice")
        Else
         Response.Write rs2("orderexchangechange")
         ValorDua = rs2("orderquantity")*rs2("orderitemprice")*rs2("orderexchangechange")
        End If
       Else
        Response.Write "NoFacturado"
       End If
       rs2.Close
       Set rs2 = Nothing

     

    martes, 7 de junio de 2016 20:13