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;