verificar validar saber registro existe datos comprobar columna campo sql sql-server performance select count

sql - saber - validar si un registro existe en la base de datos



La forma más rápida de determinar si existe un registro (12)

A continuación se muestra la manera más simple y rápida para determinar si existe un registro en la base de datos o no. Lo bueno es que funciona en todos los DB relacionales.

SELECT distinct 1 products.id FROM products WHERE products.id = ?;

Como sugiere el título ... Estoy tratando de encontrar la manera más rápida con la menor sobrecarga para determinar si existe un registro en una tabla o no.

Consulta de muestra:

SELECT COUNT(*) FROM products WHERE products.id = ?; vs SELECT COUNT(products.id) FROM products WHERE products.id = ?; vs SELECT products.id FROM products WHERE products.id = ?;

Decir el ? se intercambia con ''TB100'' ... tanto la primera como la segunda consulta arrojarán exactamente el mismo resultado (digamos ... 1 para esta conversación). La última consulta devolverá ''TB100'' como se esperaba, o nada si la id no está presente en la tabla.

El objetivo es averiguar si la id está en la mesa o no. De lo contrario, el programa insertará el registro, si lo está, el programa lo omitirá o realizará una consulta de ACTUALIZACIÓN basada en otra lógica de programa fuera del alcance de esta pregunta.

¿Cuál es más rápido y tiene menos sobrecarga? (Esto se repetirá decenas de miles de veces por ejecución del programa, y ​​se ejecutará muchas veces al día).

(Ejecutando esta consulta contra M $ SQL Server desde Java a través del controlador JDBC proporcionado por M $)


Lo he usado en el pasado y no requiere un escaneo completo de la tabla para ver si existe algo. Es súper rápido ...

UPDATE TableName SET column=value WHERE column=value IF @@ROWCOUNT=0 BEGIN --Do work END


Nada puede vencer -

SELECT TOP 1 1 FROM products WHERE id = ''some value'';

No necesita contar para saber si hay datos en la tabla. Y no use alias cuando no sea necesario.


No crea que nadie lo haya mencionado todavía, pero si está seguro de que los datos no cambiarán debajo de usted, también puede aplicar la sugerencia de NoLock para asegurarse de que no esté bloqueado al leer.

SELECT CASE WHEN EXISTS (SELECT 1 FROM dbo.[YourTable] WITH (NOLOCK) WHERE [YourColumn] = [YourValue]) THEN CAST (1 AS BIT) ELSE CAST (0 AS BIT) END


Para aquellos que tropiezan con esto desde MySQL u Oracle, MySQL soporta la cláusula LIMIT para seleccionar un número limitado de registros, mientras que Oracle usa ROWNUM.


También puedes usar

If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name=''Scot'') BEGIN --<Do something> END ELSE BEGIN --<Do something> END


EXISTS (o NOT EXISTS ) está especialmente diseñado para verificar si existe algo y, por lo tanto, debería ser (y es) la mejor opción. Se detendrá en la primera fila que coincida por lo que no requiere una cláusula TOP y en realidad no selecciona ningún dato, por lo que no hay una tara en el tamaño de las columnas. Puede usar SELECT * forma segura, no diferente de SELECT 1 , SELECT NULL o SELECT AnyColumn ... (incluso puede usar expresiones no válidas como SELECT 1/0 y no se romperá) .

IF EXISTS (SELECT * FROM Products WHERE id = ?) BEGIN --do what you need if exists END ELSE BEGIN --do what needs to be done if not END


SELECT TOP 1 products.id FROM products WHERE products.id = ?; superará todas sus sugerencias, ya que terminará la ejecución después de encontrar el primer registro.


DECLARE @USER TABLE(SM_Tbl_Name nvarchar(100),SM_Col_Namenvarchar(100),SM_Disp_Name nvarchar(200),SM_Data_Type nvarchar(100),SM_Is_Required BIT, SM_UI_Tag nvarchar(100),SM_Master_Table nvarchar(100),SM_Text_Field,nvarchar(100),SM_Value_Field,nvarchar(100),SM_Where_Cond nvarchar(400),SM_Is_Readonly BIT,SM_Isactive BIT,SM_Status VARCHAR(1)) INSERT INTO @USER(SM_Tbl_Name,SM_Col_Name,SM_Disp_Name,SM_Data_Type,SM_Is_Required,SM_UI_Tag,SM_Master_Table,SM_Text_Field,SM_Value_Field,SM_Where_Cond,SM_Is_Readonly,SM_Isactive,SM_Status) SELECT ''SADM_Users'' as SM_Tbl_Name,''Flex_3''as SM_Col_Name,''Salesman Status Principal'' as SM_Disp_Name,''Int'' as SM_Data_Type,''0'' as SM_Is_Required,''DropDown'' as SM_UI_Tag,''ADM_LOVs'' as SM_Master_Table,''ALOV_Name'' as SM_Text_Field,''ALOV_Id'' as SM_Value_Field, ''ALOV_Type=''''SALESMAN_STATUS_PRINCIPAL'''''' as SM_Where_Cond,''0'' as SM_Is_Readonly,''1'' as SM_Isactive,''I'' as SM_Status UNION SELECT ''SADM_Users'' as SM_Tbl_Name,''Flex_4''as SM_Col_Name,''Salesman Status Channel'' as SM_Disp_Name,''Int'' as SM_Data_Type,''0'' as SM_Is_Required,''DropDown'' as SM_UI_Tag,''ADM_LOVs'' as SM_Master_Table,''ALOV_Name'' as SM_Text_Field,''ALOV_Id'' as SM_Value_Field, ''ALOV_Type=''''SALESMAN_STATUS_CHANNEL'''''' as SM_Where_Cond,''0'' as SM_Is_Readonly,''1'' as SM_Isactive,''I'' as SM_Status UNION SELECT ''SADM_Users'' as SM_Tbl_Name,''Flex_5''as SM_Col_Name,''Supervisor Status Principal'' as SM_Disp_Name,''Int'' as SM_Data_Type,''0'' as SM_Is_Required,''DropDown'' as SM_UI_Tag,''ADM_LOVs'' as SM_Master_Table,''ALOV_Name'' as SM_Text_Field,''ALOV_Id'' as SM_Value_Field, ''ALOV_Type=''''SUPERVISOR_STATUS_PRINCIPAL'''''' as SM_Where_Cond,''0'' as SM_Is_Readonly,''1'' as SM_Isactive,''I'' as SM_Status UNION SELECT ''SADM_Users'' as SM_Tbl_Name,''Flex_6''as SM_Col_Name,''Supervisor Status Channel'' as SM_Disp_Name,''Int'' as SM_Data_Type,''0'' as SM_Is_Required,''DropDown'' as SM_UI_Tag,''ADM_LOVs'' as SM_Master_Table,''ALOV_Name'' as SM_Text_Field,''ALOV_Id'' as SM_Value_Field, ''ALOV_Type=''''SUPERVISOR_STATUS_CHANNEL'''''' as SM_Where_Cond,''0'' as SM_Is_Readonly,''1'' as SM_Isactive,''I'' as SM_Status INSERT INTO [dbo].[SADM_Flex_Ext_Def](SM_Tenant_Id,SM_Bu_Id,SM_Tbl_Name,SM_Col_Name,SM_Disp_Name,SM_Data_Type,SM_Is_Required,SM_UI_Tag,SM_Master_Table,SM_Text_Field,SM_Value_Field,SM_Where_Cond,SM_Is_Readonly,SM_Isactive,SM_Status) SELECT 1 as SM_Tenant_Id,1 as SM_Bu_Id,T.SM_Tbl_Name,T.SM_Col_Name,T.SM_Disp_Name,T.SM_Data_Type,T.SM_Is_Required,T.SM_UI_Tag,T.SM_Master_Table,T.SM_Text_Field,T.SM_Value_Field,T.SM_Where_Cond,T.SM_Is_Readonly,T.SM_Isactive,T.SM_Status FROM @USER as T left join SADM_Flex_Ext_Def as TT on TT.SM_Tenant_Id=97 and TT.SM_Bu_Id=41 and TT.SM_Col_Name=T.SM_Col_Name and TT.SM_Tbl_Name=T.SM_Tbl_Name WHERE TT.SM_Id IS NULL PRINT ''SADM_Flex_Ext_Def - Insert: '' + CONVERT(VARCHAR, @@ROWCOUNT) GO


SELECT CASE WHEN EXISTS (SELECT TOP 1 * FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) THEN CAST (1 AS BIT) ELSE CAST (0 AS BIT) END

Este enfoque le devuelve un valor booleano.


SELECT COUNT(*) FROM products WHERE products.id = ?;

Esta es la solución de base de datos relacional cruzada que funciona en todas las bases de datos.


create or replace procedure ex(j in number) as i number; begin select id into i from student where id=j; if i is not null then dbms_output.put_line(''exists''); end if; exception when no_data_found then dbms_output.put_line(i||'' does not exists''); end;