none
Validar si hay registros en una tabla sql server RRS feed

  • Pregunta

  • Hola, tengo la consulta siguiente

    DECLARE @CtaBanco Varchar (20)
    SET @CtaBanco=1
    IF EXISTS (SELECT top 1 1 from carClienteFormaPago CFP WITH (NOLOCK)
    LEFT OUTER JOIN carPrefactura CP WITH (NOLOCK)
    ON CP.cveCliente= CFP.cveCliente
    WHERE (CFP.BancoCtaDll= 'NO IDENTIFICADO' OR CFP.BancoCtaDll= 'NULL') 
    AND (CFP.NumCtaDll= 'NO IDENTIFICADO' OR CFP.NumCtaDll= 'NULL' )
    AND CP.idPrefactura= @Id)
    BEGIN
    SELECT CtaBanco=@CtaBanco
    END
    ELSE
    SELECT CtaBanco=0

    Si existe un registro null o no identificado mi @ctabanco sera 1 y si no sera 0

    pero quiero también validar que si no hay registro en la tabla mi @ctabanco sea 1

    se puede hacer esto también en mi consulta para no modificar mi código ? en caso de que si me pueden indicar como puedo lograrlo.

    gracias


    Molitaa

    lunes, 30 de enero de 2017 16:29

Respuestas

  • molitaa,

    Permiteme algunas observaciones respecto a la consulta que muestras:

    - ¿En realidad deseas combinar las filas de ambas tablas mediante OUTER JOIN? Si es así entonces no tiene sentido combinar por la segunda tabla para efectos de validar la existencia, es más, colocar una expresión en la cláusula WHERE conteniendo una columna de la tabla de la derecha (la que se supone no es necesario encontrar una coincidencia) hace el efecto de INNER JOIN.

    - ¿En realidad tienes escrito el literal 'NULL'?

    Hago los cambios según las observaciones dadas:

    SELECT CtaBanco =	
        CASE
    	   WHEN EXISTS (SELECT 1 
    		  FROM 
    			 carClienteFormaPago CFP
    			 INNER JOIN carPrefactura CP ON CP.cveCliente = CFP.cveCliente	   
    		  WHERE 
    			 (CFP.BancoCtaDll = 'NO IDENTIFICADO' OR CFP.BancoCtaDll IS NULL) 
    			 AND (CFP.NumCtaDll = 'NO IDENTIFICADO' OR CFP.NumCtaDll IS NULL)
    			 AND CP.idPrefactura = @Id) OR 
    		  NOT EXISTS (SELECT 1 FROM carClienteFormaPago) THEN 1
    	   ELSE 0
        END
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta molitaa lunes, 30 de enero de 2017 18:08
    lunes, 30 de enero de 2017 16:54

Todas las respuestas

  • Hola, buenos días, si lo que quieres es validar si no hay registro en tu tabla sin tener en cuenta el parametro @Id hazlo así:
    DECLARE @CtaBanco Varchar (20)
    SET @CtaBanco=1
    IF EXISTS (SELECT top 1 1 from carClienteFormaPago CFP WITH (NOLOCK)
    LEFT OUTER JOIN carPrefactura CP WITH (NOLOCK)
    ON CP.cveCliente= CFP.cveCliente
    WHERE (CFP.BancoCtaDll= 'NO IDENTIFICADO' OR CFP.BancoCtaDll= 'NULL') 
    AND (CFP.NumCtaDll= 'NO IDENTIFICADO' OR CFP.NumCtaDll= 'NULL' )
    AND CP.idPrefactura= @Id) OR NOT EXIST(SELECT 1 FROM carPrefactura cp)
    BEGIN
    SELECT CtaBanco=@CtaBanco
    END
    ELSE
    SELECT CtaBanco=0
    Si debes tener en cuenta el @Id entonces agregalo aca --> 
    OR NOT EXIST(SELECT 1 FROM carPrefactura cp WHERE idPrefactura = @Id)
    lunes, 30 de enero de 2017 16:41
  • Trata:

    IF NOT EXISTS (SELECT * FROM carClienteFormaPago)
    	SELECT 1 AS CtaBanco;
    ELSE
    	IF EXISTS (
    		SELECT
    			* 
    		FROM 
    			carClienteFormaPago CFP WITH (NOLOCK)
    			INNER JOIN 
    			carPrefactura CP WITH (NOLOCK)
    			ON CP.cveCliente = CFP.cveCliente
    		WHERE 
    			(
    			CFP.BancoCtaDll= 'NO IDENTIFICADO' 
    			AND (CFP.BancoCtaDll= 'NULL' OR CFP.NumCtaDll= 'NULL')
    			)
    			AND CP.idPrefactura = @Id
    		)
    		SELECT 1 AS CtaBanco;
    	ELSE
    		SELECT 0 AS CtaBanco;
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 30 de enero de 2017 16:43
  • molitaa,

    Permiteme algunas observaciones respecto a la consulta que muestras:

    - ¿En realidad deseas combinar las filas de ambas tablas mediante OUTER JOIN? Si es así entonces no tiene sentido combinar por la segunda tabla para efectos de validar la existencia, es más, colocar una expresión en la cláusula WHERE conteniendo una columna de la tabla de la derecha (la que se supone no es necesario encontrar una coincidencia) hace el efecto de INNER JOIN.

    - ¿En realidad tienes escrito el literal 'NULL'?

    Hago los cambios según las observaciones dadas:

    SELECT CtaBanco =	
        CASE
    	   WHEN EXISTS (SELECT 1 
    		  FROM 
    			 carClienteFormaPago CFP
    			 INNER JOIN carPrefactura CP ON CP.cveCliente = CFP.cveCliente	   
    		  WHERE 
    			 (CFP.BancoCtaDll = 'NO IDENTIFICADO' OR CFP.BancoCtaDll IS NULL) 
    			 AND (CFP.NumCtaDll = 'NO IDENTIFICADO' OR CFP.NumCtaDll IS NULL)
    			 AND CP.idPrefactura = @Id) OR 
    		  NOT EXISTS (SELECT 1 FROM carClienteFormaPago) THEN 1
    	   ELSE 0
        END
    GO



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta molitaa lunes, 30 de enero de 2017 18:08
    lunes, 30 de enero de 2017 16:54
  • Muchas gracias por las respuestas, me han sido de mucha utilidad.

    La verdad es que no tome una respuesta en concreto si no que de las tres tome un poco.

    me quede con el IF colocando un OR NOT EXISTS retire LEFT OUTER JOIN de la relación entre mis tablas dejando solo INNER JOIN.

    Realice pruebas y me ha funcionado de manera correcta. Se que es muy sencilla mi pregunta para Ustedes, estoy en proceso de seguir aprendiendo más y aun tengo dificultad para hacer mis consultas, les agradezco sus respuestas.

    Que tengan una linda tarde.


    Molitaa

    lunes, 30 de enero de 2017 18:08
  • Algo que debes tener en cuenta para otros queries es que si una columna acepta la marca NULL y deseas indagar por aquellas filas donde esta columna contenga dicha marca entonces debes usar IS [NOT] NULL.

    De seguro otros como yo pensaron que almacenavas la cadena 'NULL' para esos casos.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas



    lunes, 30 de enero de 2017 20:33