Pregunta

Tengo una consulta que tiene una lista de valores base y una lista de valores de idioma. Cada valor tiene una clave que coincide con la otra. Los valores básicos se almacenan en una tabla y los valores de idioma en otra. Mi problema es que necesito eliminar todos los valores base coincidentes de la CONSULTA excepto uno. Luego, exporto esa consulta a una hoja de cálculo de Excel (puedo hacer esta parte bien) y le permito al usuario editar los valores de idioma.

Cuando el usuario edita y / o inserta nuevos valores de idioma, necesito actualizar la base de datos, excepto que ahora escribo sobre los valores coincidentes en la base de datos (como los que se eliminaron la primera vez).

En la simplicidad, el cliente paga las traducciones y, si puedo generar una hoja que requiera menos traducciones (como frases que reaparecen a menudo), entonces pueden ahorrar dinero, de ahí el proyecto, para empezar. Me doy cuenta de que el inconveniente es que no es una verdadera lista enlazada, donde todos los valores coincidentes pertenecen a una fila en la tabla de idiomas (lo que hubiera sido fácil). En cambio, hay varios valores que son idénticos que deben actualizarse como se describió anteriormente.


Sí, estoy confundido por eso, por lo que puede parecer un poco vago. Aquí hay una muestra:

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*

Resultado deseado (cuando se consulta)

Tabla 1     Descripción del artículo1     Descripción del artículo2     Descripción del artículo3     Descripción del artículo 4     Descripción del artículo5     Descripción del artículo6

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)

El usuario realiza sus modificaciones, incluida la inserción de datos en filas en blanco (como la fila 6 para el idioma) y luego vuelve a subir:

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)

También hay una clave de recursos que coincide con cada " Descripción del elemento " a una sola "descripción de artículo en otro idioma". La única vez que se van a ver entre sí es durante este proceso de traducción; en todos los demás casos, los valores pueden ser diferentes, por lo que las claves de recursos no pueden simplemente cambiarse a todos los puntos de una traducción de forma permanente.

También debería agregar, no debería haber ninguna alteración de la estructura de las tablas o la eliminación de filas de la tabla.


Ok, aquí hay una revisión actualizada de lo que ME GUSTARÍA que hiciera la consulta, pero obviamente no lo hago ya que realmente necesito los valores de la tabla unida:

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
¿Fue útil?

Solución 3

¡Gracias por esa actualización!

Al ver eso y agregarlo a una publicación anterior, finalmente se me ocurrió esto:

<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>

Me di cuenta de que no necesitaba un valor_recurso específico, solo uno que estuviera allí. También me di cuenta de que no necesitaba la clave de recursos fuera de la consulta. La actualización actualizará TODOS los valores base coincidentes, por lo que, después de todo, no necesitaba realmente la clave de recursos, lo que me permitió usar GROUP BY.

Tomó un tiempo, perdón por la pobre explicación, ¡pero esto es todo! :) Gracias por toda la ayuda.

Otros consejos

Hrm, todavía no tengo muy claro cuál es realmente el problema, pero déjame darle una oportunidad.

Tablas:

BASE_VALUES
------------------
BASE_VALUE_RK
BASE_VALUE_NAME

RESOURCE_VALUES (these are the translations, I'm guessing)
-----------------------
RESOURCE_KEY
RESOURCE_LANGUAGE_ID
RESOURCE_VALUE

Desea recuperar un valor base y todos los valores de traducción correspondientes que coincidan con ese valor base, exportarlos a Excel y luego volver a cargarlos a través de una actualización (creo).

SQL para SELECCIONAR datos:

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;

Eso te dará:

1234    Foo
1235    Bar
1236    Baz

Exporte eso para sobresalir y recupérelo con actualizaciones:

1234    Goo
1235    Car
1236    Spaz

Luego puedes decir:

UPDATE RESOURCE_VALUES
   SET RESOURCE_VALUE = value_from_spreadsheet
 WHERE RESOURCE_KEY = key_from_spreadsheet

Es posible que esté muy lejos de este tipo, así que avísame y, si puedes proporcionar un poco más de detalles, quizás pueda puntuar más cerca de la marca.

¡Salud!

Si necesita eliminar todas las coincidencias excepto una, ¿por qué no eliminar todas las coincidencias ... coincidencias? ... necesitamos mejores términos ... y luego insertar la correcta. Por ejemplo, si necesita actualizar las coincidencias entre los elementos 12 y 13 en la tabla de pares de bases, haga algo como

delete from matchtable where (id1 = 12 and id2 = 13) or (id1 = 13 and id2 = 13);
insert into matchtable (id1, id2) values (12, 13);

Puede que sea demasiado simplista, pero su descripción parece vaga en algunos lugares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top