Uso detallado de EXISTS en la instrucción SQL

prefacio

En el desarrollo de negocios, se encontrarán necesidades similares.

Requisito 1: ACTUALIZAR registros en la tabla TEST_TB01; condiciones satisfactorias: estos registros no están en TEST_TB02.

Requisito 2: ACTUALIZAR los registros en la tabla TEST_TB01; condiciones satisfactorias: estos registros están en TEST_TB02.

El uso de EXISTS en la instrucción SQL puede resolver este tipo de demanda de manera más concisa.

1. Crea una tabla

1. Cree una declaración de tabla en la base de datos MySQL

CREATE TABLE TEST_TB01
(
  sensor_id   BIGINT,
  part_id     BIGINT,
  flag        VARCHAR(64)
 )
COMMENT '数据表一';
CREATE TABLE TEST_TB02
(
  sensor_id   BIGINT,
  part_id     BIGINT,
  flag        VARCHAR(64)
 )
COMMENT '数据表二';
CREATE TABLE TEST_TB03
(
  sensor_id   BIGINT,
  part_id     BIGINT,
  flag        VARCHAR(64)
 )
COMMENT '数据表三';

2. Cree una declaración de tabla en la base de datos ORACLE

CREATE TABLE TEST_TB01
(
  sensor_id  NUMBER(16),
  part_id    NUMBER(16),
  flag       VARCHAR(64)
 );
CREATE TABLE TEST_TB02
(
  sensor_id  NUMBER(16),
  part_id    NUMBER(16),
  flag       VARCHAR(64)
 );

2. Use EXISTS en la instrucción SELECT

Utilice EXISTS en la instrucción SQL de SELECT.

Insertar datos en TEST_TB01:

INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'杭州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'深圳');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

Insertar datos en TEST_TB02:

INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

Insertar datos en TEST_TB03:

INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB03 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

Ver datos TEST_TB01:
inserte la descripción de la imagen aquí
Ver datos TEST_TB02:
inserte la descripción de la imagen aquí
Ver datos TEST_TB03:
inserte la descripción de la imagen aquí

1. Usa EXISTE en SQL

Requisito: consulta los registros existentes en TEST_TB02 desde TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.

Sentencias SQL:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

Resultados de la:
inserte la descripción de la imagen aquí

2. Usando NO EXISTE en SQL

Requisito: consultar registros que no existen en TEST_TB02 desde TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.

Sentencias SQL:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE NOT EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

Resultados de la:
inserte la descripción de la imagen aquí

3. Usar múltiples NO EXISTEN en SQL

Requisito: registros de consulta de TEST_TB01 que no existen en TEST_TB02 y TEST_TB03, y la condición de asociación es que los sensor_ids de las tablas sean iguales.

Sentencias SQL:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE NOT EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id)
  AND NOT EXISTS
  (SELECT 1 FROM
    TEST_TB03 cc
  WHERE aa.sensor_id = cc.sensor_id);

Resultados de la:
inserte la descripción de la imagen aquí

4. Usar múltiples EXISTENCIAS en SQL

Requisito: consulta desde TEST_TB01 los registros que existen tanto en TEST_TB02 como en TEST_TB03, y la condición de asociación es que el sensor_id de la tabla sea igual.

Sentencias SQL:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE  EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id)
  AND  EXISTS
  (SELECT 1 FROM
    TEST_TB03 cc
  WHERE aa.sensor_id = cc.sensor_id);

Resultados de la:
inserte la descripción de la imagen aquí

5. Uso de NOT EXISTS y EXISTS en SQL

Requisito: consulta desde TEST_TB01 los registros que existen en TEST_TB02 pero no existen en TEST_TB03, y la condición de asociación es que los sensor_ids de las tablas sean iguales.

Sentencias SQL:

SELECT
  aa.sensor_id,aa.part_id,aa.flag
FROM
  TEST_TB01 aa
WHERE  EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id)
  AND NOT EXISTS
  (SELECT 1 FROM
    TEST_TB03 cc
  WHERE aa.sensor_id = cc.sensor_id);

Resultados de la:
inserte la descripción de la imagen aquí

3. Use EXISTS en la instrucción DELETE

Utilice EXISTS y NOT EXISTS en la instrucción SQL de DELETE.

Insertar datos en TEST_TB01:

INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'杭州');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'上海');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'北京');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'深圳');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

Insertar datos en TEST_TB02:

INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

1. Usar en MySQL

Requisito: elimine los registros existentes en TEST_TB02 de TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.

Nota: este ejemplo utiliza la versión de MySQL: MySQL 5.7.33.

Sentencias SQL:

DELETE  FROM 
TEST_TB01 aa
WHERE EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

Resultado de la ejecución:
inserte la descripción de la imagen aquí
Conclusión: MySQL no admite la sintaxis de EXISTS y NOT EXISTS en la instrucción SQL de DELETE. (Versión en este ejemplo: MySQL 5.7.33).

Para solucionar este requerimiento:
Sentencia SQL:

DELETE
  aa
FROM
  TEST_TB01 aa
 INNER JOIN TEST_TB02 bb
    ON aa.sensor_id = bb.sensor_id;

Aviso:En SQL, DELETE va seguido del alias del nombre de la tabla que se eliminará en el requisito.

Si no utiliza un alias, se informará un error:
inserte la descripción de la imagen aquí

2. Uso en Oracle

Requisito: elimine los registros existentes en TEST_TB02 de TEST_TB01, y la condición de asociación es que los sensor_ids de las dos tablas sean iguales.

Sentencias SQL:

DELETE  FROM 
TEST_TB01 aa
WHERE EXISTS
  (SELECT 1 FROM
    TEST_TB02 bb
  WHERE aa.sensor_id = bb.sensor_id);

Resultados de la:

TEST_TB01 antes de la ejecución:
inserte la descripción de la imagen aquí
TEST_TB02 antes de la ejecución:
inserte la descripción de la imagen aquí
TEST_TB01 después de la ejecución:
inserte la descripción de la imagen aquí

Cuarto, use EXISTS en la instrucción UPDATE

Utilice EXISTS en la instrucción SQL UPDATE.

Insertar datos en TEST_TB01:

INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2101,8811,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2102,8812,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2103,8813,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2104,8814,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2105,8815,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2106,8816,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2107,8817,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2108,8818,'城市');
INSERT INTO TEST_TB01 (sensor_id,part_id,flag) VALUES(2109,8819,'城市');

Insertar datos en TEST_TB02:

INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2101,8811,'厦门');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2102,8812,'泉州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2103,8813,'福州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2104,8814,'漳州');
INSERT INTO TEST_TB02 (sensor_id,part_id,flag) VALUES(2109,8819,'中国');

1. Usar en MySQL

Requisito: Para actualizar registros en TEST_TB01 y existentes en TEST_TB02, la condición de asociación es que los sensor_ids de las dos tablas sean iguales.

Nota: este ejemplo utiliza la versión de MySQL: MySQL 5.7.33.

Sentencias SQL:

UPDATE TEST_TB01 aa
   SET (aa.part_id, aa.flag) =
       (SELECT bb.part_id, bb.flag
          FROM TEST_TB02 bb
         WHERE aa.sensor_id = bb.sensor_id)
 WHERE EXISTS
 (SELECT 1 FROM TEST_TB02 cc 
       WHERE aa.sensor_id = cc.sensor_id);

Resultados de la ejecución:
inserte la descripción de la imagen aquí
Conclusión:MySQL no admite la sintaxis de EXISTS y NOT EXISTS en las instrucciones UPDATE SQL. (Versión en este ejemplo: MySQL 5.7.33).

Para abordar esta necesidad:

Sentencias SQL:

UPDATE TEST_TB01 aa ,TEST_TB02 bb
SET 
    aa.part_id=bb.part_id,
    aa.flag=bb.flag
WHERE aa.sensor_id = bb.sensor_id;

Resultados de la:

TEST_TB01 antes de la ejecución:
inserte la descripción de la imagen aquí
TEST_TB02 antes de la ejecución:
inserte la descripción de la imagen aquí
TEST_TB01 después de la ejecución:
inserte la descripción de la imagen aquí

2. Uso en Oracle

Requisito: Para actualizar registros en TEST_TB01 y existentes en TEST_TB02, la condición de asociación es que los sensor_ids de las dos tablas sean iguales.

Sentencias SQL:

UPDATE TEST_TB01 aa
   SET (aa.part_id, aa.flag) =
       (SELECT bb.part_id, bb.flag
          FROM TEST_TB02 bb
         WHERE aa.sensor_id = bb.sensor_id)
 WHERE EXISTS
 (SELECT 1 FROM TEST_TB02 cc 
       WHERE aa.sensor_id = cc.sensor_id);

Resultados de la:

TEST_TB01 antes de la ejecución:
inserte la descripción de la imagen aquí
TEST_TB02 antes de la ejecución:
inserte la descripción de la imagen aquí
TEST_TB01 después de la ejecución:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_27480007/article/details/131161517
Recomendado
Clasificación