Valori corrispondenti nella query di due tabelle (SQL e ColdFusion)
-
03-07-2019 - |
Domanda
Ho una query che ha un elenco di valori di base e un elenco di valori di lingua. Ogni valore ha una chiave che corrisponde all'altra. I valori di base sono memorizzati in una tabella e i valori della lingua in un'altra. Il mio problema è che devo rimuovere tutti i valori di base corrispondenti da QUERY tranne uno. Quindi, esporto quella query in un foglio di calcolo Excel (posso fare bene questa parte) e consentire all'utente di modificare i valori della lingua.
Quando l'utente modifica e / o inserisce nuovi valori di lingua, devo aggiornare il database tranne ora scrivere su qualsiasi valore corrispondente nel database (come quelli che sono stati rimossi la prima volta).
Per semplicità, il cliente paga per le traduzioni e se riesco a generare un foglio con meno traduzioni necessarie (come frasi che riappaiono spesso), possono risparmiare denaro, da cui il progetto all'inizio. Mi rendo conto che il rovescio della medaglia è che non è un vero elenco di collegamenti, in cui tutti i valori corrispondenti appartengono tutti a una riga nella tabella della lingua (che sarebbe stato facile). Esistono invece più valori identici che devono essere aggiornati come descritto sopra.
Sì, ne sono confuso ed è per questo che potrebbe sembrare un po 'vago. Ecco un esempio:
Table 1
Item Description1
Item Description2
Item Description3
Item Description2
Item Description2
Item Description4
Item Description5
Item Description6
Item Description3
Table 2
Item Desc in other Language1
Item Desc in other Language2
Item Desc in other Language3 (blank)
Item Desc in other Language3
Item Desc in other Language4
Item Desc in other Language5
*blank*
Risultato desiderato (quando richiesto)
Tabella 1 Voce Descrizione 1 Voce Descrizione 2 Descrizione articolo 3 Descrizione articolo 4 Descrizione articolo 5 Descrizione articolo6
Table 2
Item Desc in other Language1
Item Desc in other Language2
Item Desc in other Language3 (filled by matching row in Table 2)
Item Desc in other Language4
Item Desc in other Language5
Item Desc in other Language6 (blank, returned as empty string)
L'utente apporta le proprie modifiche, incluso l'inserimento di dati in righe vuote (come la riga 6 per la lingua), quindi esegue nuovamente il caricamento:
Table 1
Item Description1
Item Description2
Item Description3
Item Description2
Item Description2
Item Description4
Item Description5
Item Description6
Item Description3
Table 2
Item Desc in other Language1
Item Desc in other Language2
Item Desc in other Language3 (now matches row below)
Item Desc in other Language3
Item Desc in other Language4
Item Desc in other Language5
Item Desc in other Language6 (new value entered by user)
Esiste anche una chiave di risorsa che corrisponde a ciascuna " Descrizione articolo " a un singolo "Articolo Desc in altra lingua". L'unica volta che si incontreranno mai durante questo processo di traduzione, tutte le altre volte i valori potrebbero essere diversi, quindi le chiavi delle risorse non possono semplicemente essere cambiate in modo permanente in una sola traduzione.
Dovrei anche aggiungere, non ci dovrebbero essere alterazioni della struttura delle tabelle o rimozione delle righe della tabella.
Ok, ecco una rivisitazione aggiornata di quello che mi piacerebbe fare la query, ma ovviamente non lo faccio poiché ho davvero bisogno dei valori della tabella unita:
SELECT pe.prodtree_element_name_l, rs.resource_value, pe.prodtree_element_name_l_rk
FROM prodtree_element pe
LEFT JOIN resource_shortstrings rs
ON pe.prodtree_element_name_l_rk = rs.resource_key
WHERE rs.language_id = '5'
AND pe.prodtree_element_name_l <> ''
GROUP BY pe.prodtree_element_name_l
Soluzione 3
Ehi, grazie per l'aggiornamento!
Osservandolo e aggiungendolo in un post precedente, ho finalmente trovato questo:
<cfquery name="getRows" datasource="XXXX">
SELECT pe.prodtree_element_name_l, MAX(rs.resource_value) AS resource_value
FROM prodtree_element pe
LEFT JOIN resource_shortstrings rs
ON pe.prodtree_element_name_l_rk = rs.resource_key
WHERE rs.language_id = '5'
AND pe.prodtree_element_name_l <> ''
GROUP BY prodtree_element_name_l
</cfquery>
Mi sono reso conto che non avevo bisogno di un valore_risorsa specifico, ma solo di quello che c'era. Mi sono anche reso conto che non avevo bisogno della chiave di risorsa al di fuori della query. L'aggiornamento aggiornerà TUTTI i valori di base corrispondenti, quindi non avevo davvero bisogno della chiave di risorsa, il che mi ha permesso di utilizzare GROUP BY.
Ci è voluto un po ', scusami per la scarsa spiegazione, ma è così! :) Grazie per tutto l'aiuto.
Altri suggerimenti
Hrm, non è ancora molto chiaro su quale sia veramente il problema, ma lasciami fare un tentativo.
Tavoli:
BASE_VALUES ------------------ BASE_VALUE_RK BASE_VALUE_NAME RESOURCE_VALUES (these are the translations, I'm guessing) ----------------------- RESOURCE_KEY RESOURCE_LANGUAGE_ID RESOURCE_VALUE
Desideri recuperare un valore di base e tutti i valori di traduzione corrispondenti che corrispondono a quel valore di base, esportarli in Excel, quindi ricaricarli tramite un aggiornamento (credo).
SQL per SELEZIONARE i dati:
SELECT bv.BASE_VALUE_RK, rv.RESOURVE_VALUE FROM BASE_VALUE bv, RESOURCE_VALUE rv WHERE bv.BASE_VALUE_RK = rv.RESOURCE_KEY AND rv.resource_language_id = '5' ORDER BY 1;
Questo ti darà:
1234 Foo 1235 Bar 1236 Baz
Esportalo in Excel e ripristinalo con gli aggiornamenti:
1234 Goo 1235 Car 1236 Spaz
Puoi quindi dire:
UPDATE RESOURCE_VALUES SET RESOURCE_VALUE = value_from_spreadsheet WHERE RESOURCE_KEY = key_from_spreadsheet
Potrei essere molto diverso da questo ragazzo, quindi fammi sapere e, se puoi fornire un po 'più di dettagli, potrei essere in grado di segnare più vicino al segno.
Cheers!
Se devi rimuovere tutte le corrispondenze tranne una, perché non eliminare tutte le corrispondenze ... corrispondenze ... abbiamo bisogno di termini migliori ... e quindi inserire quella corretta. Ad esempio, se è necessario aggiornare le corrispondenze tra gli articoli 12 e 13 nella tabella delle coppie di basi, fare qualcosa del genere
delete from matchtable where (id1 = 12 and id2 = 13) or (id1 = 13 and id2 = 13);
insert into matchtable (id1, id2) values (12, 13);
Forse sto semplificando troppo, ma la tua descrizione sembra vaga in alcuni punti.