Aclaración del problema de unión SQL

Tengo dos mesas. cliente (ID de cliente, empresa, estado, estado) y estado de soporte (ID de cliente, empresa, estado, acuerdo). ¿No debería la siguiente consulta devolver todas las empresas que tienen un valor de acuerdo de 0 y cuyo estado no es igual a "inhabilitado"? Estoy confundido porque estoy seleccionando empresa, estoy uniendo las dos tablas por el factor común (clientid) y estoy filtrando los resultados de la consulta.

SELECT cl.company
FROM   clients cl
       INNER JOIN supportstatus su
         ON cl.clientid = su.clientid
WHERE  su.agreement11 = 0
       AND su.status <> 'disabled'
ORDER  BY cl.company  

Fuente de ColdFusion

<cfquery name="qryPendingAgreement" datasource="support">
SELECT clientid
FROM supportstatus
WHERE agreement11 = 0 AND status <> 'disabled'
</cfquery>

<cfquery name="qryClient" datasource="support">
SELECT     clientid, company, state, serv_billing
FROM         clients
WHERE prod_arth = 1 OR prod_artr = 1 OR prod_epcr_host = 1 OR prod_epcr_remote = 1 OR prod_billing = 1 OR prod_collections = 1
</cfquery>

<cfquery name="qryResults" dbtype="query">
SELECT qryClient.company, qryClient.state, qryClient.serv_billing
FROM qryPendingAgreement, qryClient
WHERE qryPendingAgreement.clientid = qryClient.clientid
order by qryClient.company
</cfquery>

preguntado el 08 de noviembre de 11 a las 14:11

¿No estás seguro de cuál es tu pregunta? Si no devuelve los resultados que espera, proporcione datos de origen de ejemplo y los resultados deseados. -

¿Qué está sucediendo exactamente con el resultado inesperado? La consulta está bien formada. -

En la línea de lo que dijo @MartinSmith y ¿puede su.status contener valores NULL? -

¿Qué ves que es diferente de lo que esperabas? Los posibles problemas con su consulta son 1) utiliza la columna agreement11, mencionaste la columna agreement y 2) estás comprobando el status campo en supportstatus, eres tú mirando en el status campo en client? -

@MasterP: Las dos versiones que ha proporcionado son no equivalente. La versión CF tiene filtros adicionales. -

3 Respuestas

No dijiste qué resultados te estaba dando la consulta. Si la consulta está filtrando más filas de las que cree que debería, la respuesta podría ser una lógica de tres valores.

null != 'disabled' -> null, que no es cierto y la fila se filtra.

Pruebe este filtro en su lugar.

WHERE  su.agreement11 = 0
    AND isnull(su.status,'') <> 'disabled'

respondido 08 nov., 11:18

perdón. Sí, mi consulta devuelve 5 resultados más que la versión CF - MasterP

@MasterP, la consulta CF tiene filtros adicionales: prod_arth = 1 OR ... - ypercubeᵀᴹ

SELECCIONE cl.company FROM clientes cl INNER JOIN supportstatus su ON cl.clientid = su.clientid DONDE su.agreement11 = 0 AND isnull (su.status, '') <> 'disabled' Order By cl.company = Recuento de parámetros incorrecto en la llamada a la función nativa 'isnull' - MasterP

cuando agrego la información adicional prod_arth obtengo muchos más resultados que no necesito. - MasterP

a) mi respuesta está dirigida a TSQL. No está utilizando TSQL, por lo que no funcionará para usted. b) mi respuesta está dirigida al texto de consulta que publicó. No está utilizando ese texto de consulta, por lo que no funcionará para usted. - Amy B

Esto debería ayudarlo a probar su consulta. Tu pregunta no fue lo suficientemente específica, así que esto es lo mejor que puedo hacer :)

    DECLARE @client TABLE
    (
      clientid int,
      company VARCHAR(50)
    )
    DECLARE @supportstatus TABLE
    (
      clientid int,
      [status] VARCHAR(50),
      agreement INT
    )

    INSERT INTO @client ([clientid],[company]) VALUES ( 0,'acme' ) 
    INSERT INTO @client ([clientid],[company]) VALUES ( 1,'byron' ) 
    INSERT INTO @client ([clientid],[company]) VALUES ( 2,'cathode' ) 

    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'disabled',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'disabled',1)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'somethingelse',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 0, 'somethingelse',1)

    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1, 'disabled',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1, 'disabled',1)
    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1,   'somethingelse',0)
    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 1,   'somethingelse',1)

    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2,   'disabled',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2, 'disabled',1)
    --INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2,   'somethingelse',0)
    INSERT INTO @supportstatus ([clientid],[status], agreement) VALUES ( 2, 'somethingelse',1)

    -- all companies who have su.agreement = 0 and su.status <> 'disabled' 
    SELECT cl.company 
    FROM @client cl 
    JOIN @supportstatus su ON cl.clientid = su.clientid 
    WHERE su.agreement = 0 AND su.status <> 'disabled' 
    Order By cl.company

respondido 08 nov., 11:18

Esta es una suposición descabellada, pero si está utilizando esta versión:

SELECT cl.company
FROM   clients cl
       INNER JOIN supportstatus su
         ON cl.clientid = su.clientid
WHERE  su.agreement11 = 0
       AND su.status <> 'disabled'
       OR prod_arth = 1      OR prod_artr = 1 
       OR prod_epcr_host = 1 OR prod_epcr_remote = 1 
       OR prod_billing = 1   OR prod_collections = 1
ORDER  BY cl.company 

el problema es el AND, OR precedencia. Prueba esto:

SELECT cl.company
FROM   clients cl
       INNER JOIN supportstatus su
         ON cl.clientid = su.clientid
WHERE  su.agreement11 = 0
       AND su.status <> 'disabled'
       AND ( prod_arth = 1      OR prod_artr = 1 
          OR prod_epcr_host = 1 OR prod_epcr_remote = 1 
          OR prod_billing = 1   OR prod_collections = 1
           )
ORDER  BY cl.company 

respondido 08 nov., 11:19

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.