DA PRA FAZER NOT NO RESULTADO DA SQL?

FBUR 25/11/2009 09:41:20
#328542
Bom dia!

Tenho uma expressão SQL que retorna cotações e seus respectivos itens.
A SQL retorna itens que possuem cotação de um fornecedor. Ou seja, só não retornará itens que não possuem nehuma cotação.

A lógica é assim:

Suponhamos que a cotação 001 tenha 3 itens : A, B e C, que por enquanto o fornecedor não enviou cotação alguma.

Quando o usuário pesquisa quais as cotações que possuem itens cotados, esta NÃO deve aparecer, pois nenhum item foi cotado.

Quando o fornecedor manda a cotação, o usuário vai lá no sistema e preenche.

Neste caso vamos supor que o fornecedor só tenha mandado a cotação do item A.

Depois de preencher a cotação do item A e salvar, quando o usuário faz uma nova pesquisa para saber as cotações que possuem itens cotados, aí sim essa cotação 001 aparece, pois embora os itens B e C não tenham sido cotados, o item A foi.

Hoje consigo fazer isso. Mas não o contrário. Ou seja, gostaria de saber as cotações dos itens que NÃO possuem cotação.

Por exemplo: A cotação 002 tem os itens D,E e F.
Nela o item F NÃO possui cotação, e embora os itens D e E tenham, ela DEVE aparecer no resultado, pois era para retornar as cotações nas quais existam itens SEM cotação (no caso, o item F).

A questão é só saber se daria para negar uma expressão SQL inteira. Ou seja, fazer um NOT no resultado da SQL.

A expressão é a seguine:

strSQL = [Ô]SELECT tblcotacoes.id,tblcotacoes.numero,tblcotacoes.status,[Ô] & _
[Ô]tblcotacoes.DataCot,tblcotacoes.obs,tblsol.numero,tblcotacoes.UltimaAlt [Ô] & _
[Ô]FROM tblcotacoes [Ô] & _
[Ô]INNER JOIN tblsol [Ô] & _
[Ô]ON tblsol.id = tblcotacoes.idSol [Ô] & _
[Ô]WHERE tblcotacoes.id IN (SELECT idCotacao FROM tblcot_pedidos [Ô] & _
[Ô]WHERE tblcot_pedidos.idCotacao = tblcotacoes.id)[Ô]



Ou desta forma, que o resultado é o mesmo:


strSQL = [Ô]SELECT tblcotacoes.id,tblcotacoes.numero,tblcotacoes.status,[Ô] & _
[Ô]tblcotacoes.DataCot,tblcotacoes.obs,tblsol.numero,tblcotacoes.UltimaAlt [Ô] & _
[Ô]FROM tblcotacoes [Ô] & _
[Ô]INNER JOIN tblsol [Ô] & _
[Ô]ON tblsol.id = tblcotacoes.idSol [Ô] & _
[Ô]WHERE EXISTS (SELECT idCotacao FROM tblcot_pedidos [Ô] & _
[Ô]WHERE tblcot_pedidos.idCotacao = tblcotacoes.id)[Ô]


OBS: Se eu colocar um NOT IN (na primeira) ou WHERE NOT EXISTS (na segunda), a SQL me retorna APENAS as cotações que TODOS os itens NÃO tenham cotação.

Banco MySQL.

[ ]'s
FBUR 25/11/2009 16:23:13
#328565
Não funcionou RCMRO.

Andei pesquisando um pocuo mais e me parece que o que resolveria o caso seria o operador MINUS. Mas ele não é suportado pelo MySQL.

Estou vendo se existe alguma alterativa para simular o MINUS.
FBUR 26/11/2009 11:26:00
#328604
Não consegui achar algo parecido com MINUS... então fiz um :D

Na verdade combinei várias tabelas com algumas sub-consultas. O resultado foi este monstro...

strSQL = [Ô](SELECT DISTINCT tblcotacoes.id,tblcotacoes.numero,tblcotacoes.status,[Ô] & _
[Ô]tblcotacoes.DataCot,tblcotacoes.obs,tblsol.numero,tblcotacoes.UltimaAlt [Ô] & _
[Ô]FROM tblcotacoes INNER JOIN tblsol [Ô] & _
[Ô]ON tblsol.id = tblcotacoes.idSol [Ô] & _
[Ô]INNER JOIN tblcot_pedidos [Ô] & _
[Ô]ON tblcotacoes.id = tblcot_pedidos.idCotacao [Ô] & _
[Ô]WHERE tblcot_pedidos.idItem IN (SELECT DISTINCT tblcot_itens.idItem [Ô] & _
[Ô]FROM tblcot_itens [Ô] & _
[Ô]INNER JOIN tblcotacoes [Ô] & _
[Ô]ON tblcotacoes.id = tblcot_itens.idCot [Ô] & _
[Ô]WHERE NOT EXISTS (SELECT tblcot_pedidos.idItem [Ô] & _
[Ô]FROM tblcot_pedidos [Ô] & _
[Ô]WHERE tblcot_pedidos.idItem = tblcot_itens.idItem [Ô] & _
[Ô]AND tblcot_pedidos.idCotacao = tblcotacoes.id[Ô] & [Ô]) [Ô] & _
[Ô]AND tblcotacoes.status = [ô]em aberto[ô][Ô] & [Ô]) [Ô] & _
[Ô]ORDER BY tblcotacoes.numero DESC) [Ô] & _
[Ô]UNION ALL [Ô] & _
[Ô](SELECT DISTINCT tblcotacoes.id,tblcotacoes.numero,tblcotacoes.status,[Ô] & _
[Ô]tblcotacoes.DataCot,tblcotacoes.obs,tblsol.numero,tblcotacoes.UltimaAlt [Ô] & _
[Ô]FROM tblcotacoes INNER JOIN tblsol [Ô] & _
[Ô]ON tblsol.id = tblcotacoes.idSol [Ô] & _
[Ô]WHERE tblcotacoes.status = [ô]em aberto[ô] [Ô] & _
[Ô]ORDER BY tblcotacoes.numero DESC)[Ô]


Esse negócio de combinar sub-consultas tá um nó na cabeça...
A única desvantagem é que não consigo usar um GROUP BY global, pois o primeiro SELECT é diferente do outro.

Mas tá quase bom... :D

[ ]'s
Tópico encerrado , respostas não são mais permitidas