Talvez o que eu estou tentando explicar é um pouco complicado, eu explico:
Eu tenho uma tabela com um campo imei, id_factura, id_albaran, transaccion, estado (entre outros).
Um imei pode ter um transacion
(Compra ou venta) e estado
(nuevo ou USADO).
Na minha consulta eu só quero isso para os 'nuevo', na tabela, existem centenas de registros com imei mas só pode haver o mesmo imei, estado = 'nuevo', transaccion = 'venta' com id_factura não nulo e / ou id_albaran não nulo.
O objectivo desta consulta é descobrir se o mesmo imei, transacion = venta, estado = nuevo, tem um registro id_factura não nulo e outro recorde id_albaran não nulo, então eu quero que ele retorne um campo se ele tem dois registros com um valor de 1 ou se ele só tem um registro que retornar 0.
Dou-lhe um exemplo do que eu quiser que a consulta de retorno, no meu caso eu só quero o que é marcado com vermelho (venda).
Eu tentei isso (mas é errado):
SELECT imei
FROM ventacompra
WHERE transacion = 'venta' AND estado='nuevo' AND id_albaran IS NOT NULL
AND imei IN (SELECT imei FROM ventacompra v WHERE transacion = 'venta' AND estado='nuevo' AND id_factura IS NOT NULL)
____EDIT PARA EXAMPLE____
transacion estado imei id_factura id_albaran has_factu_alba
venta nuevo 0001 01 NULL 1
venta nuevo 0001 NULL 01 1
compra nuevo 0002 01 NULL 0
com EXISTS
:
SELECT v.* FROM ventacompra v
WHERE v.transacion = 'venta' AND v.estado='nuevo' AND (v.id_factura IS NULL XOR v.id_albaran IS NULL)
AND EXISTS (
SELECT 1 FROM ventacompra
WHERE imei = v.imei AND transacion = v.transacion AND estado = v.estado
AND (id_factura IS NULL) = (v.id_factura IS NOT NULL)
AND (id_albaran IS NULL) = (v.id_albaran IS NOT NULL)
)
Se uma das colunas id_factura
e id_albaran
é sempre null
ea outra not null
, então você pode omitir a condição:
AND (v.id_factura IS NULL XOR v.id_albaran IS NULL)
Veja a demonstração .
Resultados:
| id_ventacompra | transacion | estado | imei | id_factura | id_albaran |
| -------------- | ---------- | ------ | --------------- | ---------- | ---------- |
| 492 | venta | nuevo | 352984109069491 | | 23 |
| 493 | venta | nuevo | 352984109069491 | 10 | |