Correspondance des valeurs dans une requête à deux tables (SQL et ColdFusion)
-
03-07-2019 - |
Question
J'ai une requête qui contient une liste de valeurs de base et une liste de valeurs de langage. Chaque valeur a une clé qui correspond à l'autre. Les valeurs de base sont stockées dans une table et les valeurs de langue dans une autre. Mon problème est que je dois obtenir toutes les valeurs de base correspondantes supprimées de la requête, sauf une. Ensuite, j'exporte cette requête dans une feuille de calcul Excel (je peux très bien faire cette partie) et permets à l'utilisateur de modifier les valeurs de langue.
Lorsque l'utilisateur modifie et / ou insère de nouvelles valeurs de langue, je dois mettre à jour la base de données, sauf maintenant écrire toutes les valeurs correspondantes dans la base de données (comme celles qui ont été supprimées la première fois).
En toute simplicité, le client paie pour les traductions et si je peux générer une feuille qui nécessite moins de traductions (comme des phrases qui réapparaissent souvent), il peut économiser de l’argent, d’où le projet. Je réalise que l’inconvénient est que ce n’est pas une vraie liste chaînée, où toutes les valeurs correspondantes appartiennent à une seule ligne de la table des langues (ce qui aurait été facile). Au lieu de cela, il existe plusieurs valeurs identiques qui doivent être mises à jour comme décrit ci-dessus.
Oui, je suis confus là-dessus, c'est pourquoi cela peut sembler un peu vague. Voici un exemple:
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*
Résultat souhaité (lorsque demandé)
Tableau 1 Item Description1 Item Description2 Item Description3 Item Description4 Item Description5 Item Description6
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'utilisateur apporte ses modifications, y compris l'insertion de données dans des lignes vierges (comme la ligne 6 pour la langue), puis reuploade:
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)
Il existe également une clé de ressource correspondant à chaque " Item Description " vers un seul "Item Desc in other Language". La seule fois où ils se verront, c'est au cours de ce processus de traduction. Dans tous les autres cas, les valeurs peuvent être différentes, de sorte que les clés de ressources ne peuvent pas simplement être modifiées de manière permanente.
Je devrais également ajouter, il ne devrait y avoir aucune modification de la structure des tables ou de la suppression des lignes de la table.
Ok, voici une révision mise à jour de ce que j'aimerais que la requête fasse, mais ne le fait évidemment pas, car j'ai réellement besoin des valeurs de la table jointe:
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
La solution 3
Hé, merci pour cette mise à jour!
En regardant cela et en l'ajoutant à un post précédent, j'ai finalement trouvé ceci:
<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>
J'ai réalisé que je n'avais pas besoin d'une valeur_ressource spécifique, mais simplement de celle qui y figurait. J'ai aussi réalisé que je n'avais pas du tout besoin de la clé de ressource en dehors de la requête. La mise à jour mettra à jour TOUTES les valeurs de base correspondantes, alors je n’ai pas vraiment besoin de la clé de ressource, ce qui m’a permis d’utiliser GROUP BY.
J'ai pris un moment, désolé pour la piètre explication, mais ça y est! :) Merci pour toute l'aide.
Autres conseils
Hm, toujours pas vraiment clair sur ce qu'est le problème, mais laissez-moi essayer.
Tableaux:
BASE_VALUES ------------------ BASE_VALUE_RK BASE_VALUE_NAME RESOURCE_VALUES (these are the translations, I'm guessing) ----------------------- RESOURCE_KEY RESOURCE_LANGUAGE_ID RESOURCE_VALUE
Vous souhaitez récupérer une valeur de base et toutes les valeurs de traduction correspondantes qui correspondent à cette valeur de base, les exporter vers Excel, puis les recharger via une mise à jour (je pense).
SQL pour SÉLECTIONNER les données:
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;
Cela vous donnera:
1234 Foo 1235 Bar 1236 Baz
Exportez-le pour exceller et récupérez-le avec les mises à jour:
1234 Goo 1235 Car 1236 Spaz
Vous pouvez alors dire:
UPDATE RESOURCE_VALUES SET RESOURCE_VALUE = value_from_spreadsheet WHERE RESOURCE_KEY = key_from_spreadsheet
Je suis peut-être un peu déçu par ce type, alors laissez-le-moi savoir et, si vous pouvez fournir un peu plus de détails, je pourrais peut-être marquer plus près du but.
Salut!
Si vous devez supprimer toutes les correspondances sauf une, pourquoi ne pas supprimer toutes les correspondances ... correspondances ... nous avons besoin de meilleures conditions ... puis insérez la bonne. Par exemple, si vous devez mettre à jour les correspondances entre les éléments 12 et 13 dans le tableau des paires de bases, procédez comme suit:
delete from matchtable where (id1 = 12 and id2 = 13) or (id1 = 13 and id2 = 13);
insert into matchtable (id1, id2) values (12, 13);
Je simplifie peut-être à outrance, mais votre description semble vague par endroits.