2009-02-04 22 views
14

Necesito crear un trabajo en segundo plano que procese una tabla buscando filas que coincidan en una identificación particular con diferentes estados. Almacenará los datos de fila en una cadena para comparar los datos contra una fila con una identificación coincidente.Cómo comparo 2 filas de la misma tabla (SQL Server)

Sé la sintaxis para obtener los datos de la fila, pero nunca he intentado comparar 2 filas de la misma tabla antes? ¿Cómo se hace? ¿Tendría que usar variables para almacenar los datos de cada uno? O de alguna otra manera?

(Uso de SQL Server 2008)

Respuesta

10

bien, después de 2 años que ha llegado la hora de corregir la sintaxis:

SELECT t1.value, t2.value 
FROM MyTable t1 
JOIN MyTable t2 
ON  t1.id = t2.id 
WHERE t1.id = @id 
     AND t1.status = @status1 
     AND t2.status = @status2 
+3

NO debe usar esa sintaxis. Use uniones específicas en su lugar. Las formas de unión izquierda y derecha de esa sintaxis están en desuso. No me sorprendería encontrar este formulario obsoleto en la próxima versión. – HLGEM

+0

@HLGEM - ¿Puede proporcionar enlaces sobre dónde se menciona esto como obsoleto, por favor? – Pauk

+3

@Pauk ms-help: //MS.SQLCC.v10/MS.SQLSVR.v10.en/s10sq_GetStart/html/c10eeaa5-3d3c-49b4-a4bd-5dc4fb190142.htm E incluso si no estaban en desuso, la izquierda y la derecha las versiones no deben usarse ya que dan resultados inconsistentes y a veces inexactos. A veces se pueden interpretar como una combinación cruzada en lugar de una combinación izquierda o derecha. – HLGEM

6

Algunas personas encuentran la siguiente sintaxis alternativa más fácil ver lo que está pasando:

select t1.value,t2.value 
from MyTable t1 
    inner join MyTable t2 on 
     t1.id = t2.id 
where t1.id = @id 
28

Puedes unirte a una tabla todas las veces que necesites, se llama self join.

Se asigna un alias a cada instancia de la tabla (como en el ejemplo a continuación) para diferenciar una de otra.

SELECT a.SelfJoinTableID 
FROM dbo.SelfJoinTable a 
     INNER JOIN dbo.SelfJoinTable b 
     ON a.SelfJoinTableID = b.SelfJoinTableID 
     INNER JOIN dbo.SelfJoinTable c 
     ON a.SelfJoinTableID = c.SelfJoinTableID 
WHERE a.Status = 'Status to filter a' 
     AND b.Status = 'Status to filter b' 
     AND c.Status = 'Status to filter c' 
+6

Bueno para usted por mencionar que debe alias – HLGEM

+16

no tantas veces como lo requiera ... existe un límite para hacer referencia a 256 tablas en la consulta:] – pkmiec

+0

@pkmiec tan intrigante como suena, [Microsoft documenta las limitaciones de SQL Server] (https://docs.microsoft.com/en-us/sql/sql-server/maximum-capacity-specifications-for-sql-server) difieren de su argumento - 'Tablas por instrucción SELECT - Limitado solo por los recursos disponibles'. Todavía no estoy seguro de si alguna vez utilizaré esta información a menos que diseñe algo realmente horrible, pero me gustaría saber cómo obtuviste ese número, definitivamente parece intrigante. –

1
SELECT * FROM A AS b INNER JOIN A AS c ON b.a = c.a 
WHERE b.a = 'some column value' 
2

SELECT COUNT(*) FROM (SELECT * FROM tbl WHERE id=1 UNION SELECT * FROM tbl WHERE id=2) a

Si usted tiene dos filas, que diferente, si uno - la misma.

Cuestiones relacionadas