AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 330900
Accepted
Nikolay Yasinskiy
Nikolay Yasinskiy
Asked: 2023-09-05 18:06:42 +0800 CST2023-09-05 18:06:42 +0800 CST 2023-09-05 18:06:42 +0800 CST

No GRASS GIS a instrução db.execute IN funciona, mas NOT IN não

  • 772

Aqui está meu comando para o banco de dados GRASS GIS (driver SQL Lite usado):

db.execute sql="UPDATE streams_order SET factor=next_stream WHERE number IS NOT NULL AND next_stream IN (SELECT number FROM streams_order)"

Mas eu quero

db.execute sql="UPDATE streams_order SET factor=next_stream WHERE number IS NOT NULL AND next_stream NOT IN (SELECT number FROM streams_order)"

E o resultado deve ser:

+---------+--------------+--------+---------+
| stream  |  next_stream   factor |  number |
+-------------------------------------------+
  370           -1           
  372           370         370       372
  374           440         
  376           372                   376
  380           374         374       380
.............................................

não funciona sem nenhum erro: a coluna "fator" fica vazia após executar o comando. Se eu colocar IN, funciona bem. Os tipos de coluna são todos INT.

Sandbox com dados reais está aqui https://dbfiddle.uk/zg8_xJUz

sqlite
  • 2 2 respostas
  • 22 Views

2 respostas

  • Voted
  1. Ergest Basha
    2023-09-05T20:56:16+08:002023-09-05T20:56:16+08:00

    se IN for suportado, então NOT IN também deverá ser suportado

    Se algo não for suportado, você enfrentará algum erro, como na pergunta anterior DBMI-SQLite driver error: Error in sqlite3_prepare(): near ".": sintaxe error in db.execute command .

    Para depurar o problema antes de executar a instrução update, execute um select.

    Se eu executar a mesma consulta de atualização transformada na instrução select, você verá que nenhum registro será retornado.

    select factor2_new,next_stream,number 
    from stream_order
    WHERE number IS NOT NULL AND next_stream NOT IN (SELECT number FROM stream_order)
    

    Agora o problema está na consulta.

    Eu sugeriria usar not existsem vez de not in, consulte SQL "selecionar onde não está na subconsulta" não retorna resultados para as diferenças entre existe e entra.

    Altere sua consulta selecionada para,

    SELECT  *
    FROM  stream_order
    WHERE number IS NOT NULL 
    AND  NOT EXISTS (SELECT  NULL
                     FROM    stream_order so
                     WHERE   so.number = stream_order.next_stream )
    

    Resultado,

    stream  next_stream factor  factor2 next_stream2    number  factor_new  factor2_new next2
      111      222      null       -1       -1           333        null    null    null
      370      -1       null       -1       -1           370        null    null    null
      398      394      null       394      394          398        null    null    null
      404      402      null       402      402          404        null    null    null
      420      416      null       416      416          420        null    null    null
      458      454      null       454      454          458        null    null    null
    

    Consulta de atualização,

    UPDATE stream_order
    SET factor2_new=next_stream 
    WHERE number IS NOT NULL 
    AND  NOT EXISTS (SELECT  NULL
                     FROM    stream_order so
                     WHERE   so.number = stream_order.next_stream )
    

    Veja exemplo aqui

    • 2
  2. Best Answer
    Andrea B.
    2023-09-05T21:19:10+08:002023-09-05T21:19:10+08:00

    Seu problema está relacionado à presença de valores NULL na numbercoluna.

    NOT IN sempre falha quando a lista tem valores NULL porque as comparações NULL não podem ser verdadeiras ou falsas.

    Mais precisamente, na lógica SQL NULL não significa "vazio", significa "indeterminado". Uma comparação val = NULLsempre resultará em NULL, mesmo que val também seja NULL. É por isso que, para verificar se algo é NULL, precisamos usar o operador especial IS NULL.

    A expressão val IN ('A', NULL)será traduzida como val='A' OR val=NULL.

    Se val for igual a 'A', isso se tornará TRUE OR NULL, que é avaliado como TRUE. (e NOT IN é avaliado como FALSE). Mas se val for igual a 'B' essa expressão se torna FALSE OR NULL, que é avaliada como NULL(e NOT IN ainda é NULL).

    Portanto, em uma lista com elementos nulos, val IN (...)será avaliado como TRUE se um dos elementos não nulos for igual a val, e NULL caso contrário, enquanto val NOT IN (...)será avaliado como FALSE se um dos elementos não nulos for igual a val e NULL caso contrário, mas será nunca é avaliado como TRUE, portanto sua atualização nunca será acionada.

    Veja também esta questão .

    Gambiarra:

    UPDATE streams_order SET factor=next_stream 
    WHERE number IS NOT NULL AND 
          next_stream NOT IN (SELECT number FROM streams_order WHERE number IS NOT NULL)
    
    • 1

relate perguntas

  • Quantas buscas de disco são necessárias para gravar uma linha no SQLite?

  • Existe uma adição de software livre para SQLite disponível para replicação de dados? [fechado]

  • Usando CoreData em um aplicativo do lado do cliente

  • Limites do SQLite

  • É possível usar o SQLite como um banco de dados cliente-servidor? [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve