Domanda

Ho scritto un'applicazione di test psicologico, in cui all'utente viene presentato un elenco di parole, e deve scegliere dieci parole che molto si descrivono, quindi scegliere parole che parzialmente descriversi e parole che non descrivono se stesso. L'applicazione stessa funziona bene, ma ero interessato a esplorare le possibilità dei metadati: quali parole sono state scelte più frequentemente nella prima categoria e quali parole non sono mai state scelte nella prima categoria. La prima query non è stata un problema, ma la seconda (quali parole non sono mai state scelte) mi lascia perplesso.

La struttura della tabella è la seguente:

table words: id, name
table choices: pid (person id), wid (word id), class (value between 1-6)

Presumibilmente la risposta coinvolge un'unione a sinistra tra parole e scelte, ma ci deve essere una dichiarazione di modifica - dove choice.class = 1 - e questo mi sta causando problemi. Scrivi qualcosa come

select words.name
from words left join choices
on words.id = choices.wid
where choices.class = 1
and choices.pid = null

fa sì che il gestore database non vada in un lungo viaggio verso il nulla. Sto usando Delphi 7 e Firebird 1.5.

TIA, No'am

È stato utile?

Soluzione

Forse è un po 'più veloce:

SELECT w.name
FROM words w
WHERE NOT EXISTS
   (SELECT 1
    FROM choices c 
    WHERE c.class = 1 and c.wid = w.id)

Altri suggerimenti

Qualcosa del genere dovrebbe fare il trucco:

SELECT name
FROM words
WHERE id NOT IN
   (SELECT DISTINCT wid   -- DISTINCT is actually redundant
    FROM choices 
    WHERE class == 1)
SELECT words.name
FROM
    words
    LEFT JOIN choices ON words.id = choices.wid AND choices.class = 1
WHERE choices.pid IS NULL

Assicurati di avere un indice su scelte (class, wid) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top