Сопоставление значений в запросе двух таблиц (SQL и ColdFusion)
-
03-07-2019 - |
Вопрос
У меня есть запрос, содержащий список базовых значений и список языковых значений.Каждое значение имеет ключ, соответствующий другому.Базовые значения хранятся в одной таблице, а языковые значения — в другой.Моя проблема в том, что мне нужно удалить все соответствующие базовые значения из ЗАПРОСА, кроме одного.Затем я экспортирую этот запрос в электронную таблицу Excel (с этой частью я справляюсь нормально) и разрешаю пользователю редактировать значения языка.
Когда пользователь редактирует и/или вставляет новые языковые значения, мне нужно обновить базу данных, за исключением записи любых совпадающих значений в базе данных (например, тех, которые были удалены в первый раз).
Проще говоря, клиент платит за переводы, и если я могу создать лист, в котором требуется меньше переводов (например, часто повторяющиеся фразы), тогда они смогут сэкономить деньги, а значит, и проект с самого начала.Я понимаю, что недостатком является то, что это не настоящий связанный список, в котором все совпадающие значения принадлежат одной строке языковой таблицы (что было бы легко).Вместо этого существует несколько одинаковых значений, которые необходимо обновить, как описано выше.
Да, я в замешательстве, поэтому это может показаться немного расплывчатым.Вот образец:
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*
Желаемый результат (при запросе)
Таблица 1 Элемент Описание1 Пункт Описание.
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)
Пользователь вносит свои изменения, включая вставку данных в пустые строки (например, строку 6 для языка), а затем повторно загружает:
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)
Существует также ключ ресурса, который соответствует каждому «Описанию элемента» одному «Описанию элемента на другом языке».Единственный раз, когда они увидят друг друга, - это во время процесса перевода, во всех остальных случаях значения могут быть разными, поэтому ключи ресурсов не могут быть просто изменены на все точки одного перевода навсегда.
Я также должен добавить, что не должно быть никакого изменения структуры таблиц или удаления строк таблицы.
Хорошо, вот обновленная версия того, что мне хотелось бы, чтобы запрос делал, но, очевидно, этого не происходит, поскольку мне действительно нужны значения объединенной таблицы:
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
Решение 3
Эй, спасибо за это обновление!
Посмотрев на это и добавив это в предыдущий пост, я наконец пришел к следующему:
<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>
Я понял, что мне не нужно конкретное значение ресурса, а только то, что там есть.Я также понял, что мне вообще не нужен ключ ресурса вне запроса.Обновление будет обновлять ВСЕ совпадающие базовые значения независимо от того, поэтому мне действительно не нужен ключ ресурса, который позволил мне использовать GROUP BY.
Прошло некоторое время, извините за плохое объяснение, но вот оно!:) Спасибо за помощь.
Другие советы
Хм, до сих пор не совсем ясно, в чем на самом деле проблема, но позвольте мне попробовать.
Таблицы:
BASE_VALUES ------------------ BASE_VALUE_RK BASE_VALUE_NAME RESOURCE_VALUES (these are the translations, I'm guessing) ----------------------- RESOURCE_KEY RESOURCE_LANGUAGE_ID RESOURCE_VALUE
Вы хотите получить одно базовое значение и все соответствующие значения перевода, соответствующие этому базовому значению, экспортировать их в Excel, а затем повторно загрузить их через обновление (я думаю).
SQL для ВЫБОРА данных:
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;
Это даст вам:
1234 Foo 1235 Bar 1236 Baz
Экспортируйте это в Excel и получите обратно с обновлениями:
1234 Goo 1235 Car 1236 Spaz
Затем вы можете сказать:
UPDATE RESOURCE_VALUES SET RESOURCE_VALUE = value_from_spreadsheet WHERE RESOURCE_KEY = key_from_spreadsheet
Возможно, я далек от этого парня, так что дайте мне знать, и, если вы предоставите немного больше деталей, я, возможно, смогу приблизиться к цели.
Ваше здоровье!
Если вам нужно удалить все совпадения, кроме одного, почему бы не удалить все совпадения...Матчи ...нам нужны лучшие условия...а затем вставьте правильный.Например, если вам нужно обновить совпадения между элементами 12 и 13 в таблице базовых пар, сделайте что-то вроде
delete from matchtable where (id1 = 12 and id2 = 13) or (id1 = 13 and id2 = 13);
insert into matchtable (id1, id2) values (12, 13);
Возможно, я упрощаю, но ваше описание местами кажется расплывчатым.