+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Oracle query "match tra due colonne simili ma non uguali"

  1. #1
    aricebtta non è in linea Novello
    Post
    8

    Wink Oracle query "match tra due colonne simili ma non uguali"

    Ciao a tutti,
    ho bisogno del vostro aiuto.
    Ho due colonne in Oracle, stessa tabella.
    Una "codice" e una "file".
    La colonna file in genere è data dal codice più altri valori.
    Avrei bisogno di trovare tutti i record in cui nella colonna file non è contenuto il "codice" della stessa riga.


    colonna 1
    CODICE
    1234
    2345
    9999

    colonna 2
    FILE
    1234_3452
    3456_5674
    3654_9999

    La query dovrebbe restituirmi solo la seconda riga.
    é possibile?
    Esiste un comando "contiene" o "non contiene".
    Vi ringrazio sin d'ora, se vorrete aiutarmi.
    Ciao a tutti!!

  2. #2
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,773

  3. #3
    aricebtta non è in linea Novello
    Post
    8
    Grazie Gibra!!
    Ci hai preso in pieno.
    Il comando mi permette di troncare il valore che contiene l'altro ma probabilmente scrivo male la query perchè mi restituisce errore:"la subquery monoriga restituisce più di una riga".
    la query che ho scritto è:

    SELECT * from tabella where cod_tipo_documento=01 and codice<> (SELECT SUBSTR(file,8,5) FROM tabella WHERE cod_tipo_documento =01).
    cosa sbaglio?
    tieni presente che la tabella è molto grossa e la maggior parte delle righe hanno rispondenza tra file e codice ma devo trovare quelle righe in cui il codice non è contenuto nella colonna file.
    Intanto, grazie davvero perchè la subquery è perfetta!

  4. #4
    L'avatar di gibra
    gibra non è in linea Amanuense
    Luogo
    Breganze (VI)
    Post
    5,773
    Mi pare che l'errore che ricevi sia più che chiaro:

    La tua sub-query restituisce più di una riga, quindi non viene accettata perché il confronto con l'operatore <> richiede una corrsipondenza univoca.

    In questi casi si usa l'operatore NOT IN invece di <> quindi dovresti scrivere:

    codice:
    ... AND codice NOT IN (SELECT...........)
    Accertati che il campo che usi nella subquery sia indicizzato, altrimenti avendo una tabella 'corposa' le performance possono scadere sensibilmente.

  5. #5
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    14,890
    Blogs
    5
    Perché nella sezione "Pausa Caffè"? Sposto in Oracle ... occhio ...
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  6. #6
    aricebtta non è in linea Novello
    Post
    8
    Quote Originariamente inviato da gibra Visualizza il messaggio
    Mi pare che l'errore che ricevi sia più che chiaro:

    La tua sub-query restituisce più di una riga, quindi non viene accettata perché il confronto con l'operatore <> richiede una corrsipondenza univoca.

    In questi casi si usa l'operatore NOT IN invece di <> quindi dovresti scrivere:

    codice:
    ... AND codice NOT IN (SELECT...........)
    Accertati che il campo che usi nella subquery sia indicizzato, altrimenti avendo una tabella 'corposa' le performance possono scadere sensibilmente.


    Perfetto! Chiarissimo!
    Grazie mille. é proprio come dici tu.
    Alla fine, ho risolto con INSTR perchè mi sono accorta che i record a cui applicavo la SUBSTR non avevano tutti la stessa lunghezza!!
    Mi scuso per non aver inserito il codice nel tag. La prossima volta sarà mia cura!
    Grazie ancora per l'aiuto

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi