SQL Consuly (¿dinámica?) Para verificar cada entrada de historial tiene una coincidencia

StackOverflow https://stackoverflow.com/questions/8889496

  •  29-10-2019
  •  | 
  •  

Pregunta

Tengo un procedimiento almacenado que está generando un número de flotación aleatorio como marcador de ID, y tan pronto como se llama almacena el número aleatorio + .1 en una tabla de historial/registro, y luego el resultado final se almacena con el mismo aleatorio Número +.2 (como secuenciador/clasificador).

¿Existe una manera fácil de consultar dinámicamente una columna llena de estos números de secuencia (como se muestra a continuación) y para verificar que hay un número par de (pares) para asegurarse fácilmente de que el procedimiento almacenado siempre se haya procesado correctamente?

1568.1
1568.2
8452.1
8452.2
9886.1
9886.2
5455.1
3682.1
3682.2
4857.1
4857.2

En los datos de muestra anteriores, me gustaría una consulta que alerta a la presencia de 5455.1, ya que no tiene una segunda parte (5455.2) que siempre debería tener, ya que mi procedimiento almacenado registra una segunda entrada con los resultados de la llamada (éxito o falla).

Por supuesto, necesito que no solo me alerte de que el problema/rolio existe (ya que simplemente podría ejecutar un recuento en la mesa y ver si el número es incluso para determinar eso), sino que me gustaría poder seleccionar los desajustes Por lo tanto, no estoy clasificando 10,000 líneas de historia/registros para encontrar la que no tiene un compañero.

¿Fue útil?

Solución

Primero, su tecla de identificación no debe ser una columna, debe ser dos. Es decir, en lugar de

CREATE TABLE OneCol  (IDKey DECIMAL(6, 1) Primary Key);

Deberías tener algo como:

CREATE TABLE TwoCol  
(
    IDRand INT, 
    PhaseID TINYINT
    Primary Key  (IDRand, PhaseID)
)

Suponiendo esto entonces y además que la anomalía específica que está buscando es una ID con {fase = 1) pero no correspondiente {fase = 2} esta única forma de escribir la consulta:

SELECT IDRand FROM TwoCol WHERE PhaseID = 1
EXCEPT
SELECT IDRand FROM TwoCol WHERE PhaseID = 2

Otros consejos

Perdón por la longitud aquí, pero espero que pueda ayudar a la próxima persona que aparece ...

Como se sugirió anteriormente, dividiré la ID aleatoria en dos campos: el primero con la ID aleatoria y el segundo con la ID de "fase". El uso de la declaración excepto anterior funciona para devolver una lista de ID aleatorias que se iniciaron (existe la fase 1) pero que están a falta de la segunda/fase de finalización.

Sin embargo, dado que no quiero pasar tiempo mirando cada librería individualmente, envolví la declaración excepto en una declaración en la copia a continuación. Esto me permite controlar qué campos realmente se devuelven.

SELECT randomid, phaseid, info, type, time
FROM history
WHERE randomid IN (
SELECT randomid FROM history WHERE phaseid = '1' 
EXCEPT 
SELECT randomid FROM history WHERE phaseid = '2'  
)

Nota: Envolver la instrucción excepto como yo los resultados en la porción distinta (ver el enlace a continuación) se ignora ya que estoy especificando para seleccionar todo. Además, necesitaré mejorar mi rango de números aleatorios y o agregarle un código de fecha para evitar una duplicación. Si alguna vez obtuve el mismo número aleatorio dos veces, y si uno completó y otro falló, el que falló (no tenía una fase 2) no aparecería en los resultados de la consulta excepto la declaración como la existencia de cualquier fase de finalización coincidente satisfará la cláusula excepto. No está verificando que haya una fase de finalización para cada fase inicial, solo que existe una fase de finalización con una ID aleatoria coincidente.

Si tuviera un esquema de números mal aleatorios que resultó en duplicados, podría tener 16 entradas en la tabla con la misma ID aleatoria (digamos que la ID aleatoria es 1337). El número par de entradas con un deshielo de 1337 se vería bien a pesar de que podría haber tenido un número par de errores (verificar un recuento uniforme de entradas en la base de datos realmente no es una buena manera de verificar los errores ahora que pienso que creo De esto, aunque podría contar el número de ID de fase que son 1 y compararlo con un recuento de aquellos con un PID de 2 para verificar los resultados de mi consulta). De esas 16 entradas, digamos que 6 se completaron correctamente (Fase 1 y Fase 2), y los 4 restantes habían fallado de alguna manera. Dado que existía una entrada en la base de datos para Rid 1337 con un PID de 2, ninguna de las 4 fallas aparecería.

¡Gracias por señalarme en la dirección correcta, Barry!

========================================================

El siguiente enlace parecía aumentar un poco más con los ejemplos excepto del operador que otros sitios, a pesar de ser más antiguo (Statiung de que solo se devuelven los resultados distintos, frente a todos los resultados).

http://www.databasejournal.com/features/mssql/article.php/3602601/except-operator-in-sql-server-2005.htm

========================================================

General de Pinal Dave resumen del operador:

Uno de los Jr. El desarrollador me preguntó hace un día, ¿SQL Server tiene una operación similar como la cláusula MINUS en Oracle?

Absolutamente, excepto que la cláusula en SQL Server es exactamente similar a la operación menos en Oracle. La consulta excepto y menos consulta devuelve todas las filas en la primera consulta que no se devuelven en la segunda consulta. Cada declaración SQL dentro de la consulta excepto y menos consulta debe tener el mismo número de campos en los conjuntos de resultados con tipos de datos similares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top