DA PRA FAZER NOT NO RESULTADO DA SQL?
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:
Ou desta forma, que o resultado é o mesmo:
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
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
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.
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.
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...
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
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