2つのテーブルクエリの値を一致させる(SQLおよびColdFusion)
-
03-07-2019 - |
質問
ベース値のリストと言語値のリストを含むクエリがあります。各値には、互いに一致するキーがあります。基本値は1つのテーブルに保存され、言語値は別のテーブルに保存されます。私の問題は、1つを除くすべての一致するベース値をクエリから削除する必要があることです。次に、そのクエリをExcelスプレッドシートにエクスポートし(この部分は問題なく実行できます)、ユーザーが言語値を編集できるようにします。
ユーザーが新しい言語値を編集および/または挿入すると、データベース内の一致する値(最初に削除された値など)を上書きする以外は、データベースを更新する必要があります。
簡単に言えば、クライアントは翻訳にお金を払うので、必要な翻訳の数が少ないシート(頻繁に再出現するフレーズなど)を生成できれば、お金を節約できるので、プロジェクトを開始できます。欠点は、すべての一致する値がすべて言語テーブルの1つの行に属している本当のリンクリストではないことです(簡単だったでしょう)。代わりに、上記のように更新する必要がある同一の値が複数あります。
はい、私はそれで混乱しています。それが少しあいまいに見えるかもしれない理由です。サンプルを次に示します。
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 アイテム説明2 アイテム説明3 アイテム説明4 アイテム説明5 アイテムの説明6
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)
各" Item Description"に一致するリソースキーもあります。単一の「他の言語のアイテム説明」に。彼らがお互いに会うのはこの翻訳プロセス中のみです。それ以外の場合は値が異なる可能性があるため、リソースキーを単に1つの翻訳のすべてのポイントに永久に変更することはできません。
また、テーブルの構造を変更したり、テーブルの行を削除したりしないでください。
さて、ここでクエリのようなものの更新された改訂版がありますが、実際には結合されたテーブルの値が必要なので、明らかにそうではありません:
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>
特定のresource_valueは必要なく、そこにあるものだけが必要であることに気付きました。また、クエリ以外ではリソースキーが不要であることに気付きました。更新では、一致するすべてのベース値が更新されるため、リソースキーは実際には必要ありませんでした。これにより、GROUP BYを使用できました。
説明に不便をおかけして申し訳ありませんが、しばらくお待ちください。 :)すべての助けてくれてありがとう。
他のヒント
Hrm、問題が本当に何であるかはまだ明確ではありませんが、試してみましょう。
テーブル:
BASE_VALUES ------------------ BASE_VALUE_RK BASE_VALUE_NAME RESOURCE_VALUES (these are the translations, I'm guessing) ----------------------- RESOURCE_KEY RESOURCE_LANGUAGE_ID RESOURCE_VALUE
1つのベース値と、そのベース値に一致するすべての対応する変換値を取得し、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
私はこの男のベースから外れているかもしれないので、私に知らせてください、そしてあなたがもう少し詳細を提供することができれば、私はマークにより近くスコアリングできるかもしれません。
乾杯!
1つを除くすべての一致を削除する必要がある場合、すべての一致...一致...を削除しないでください...より良い用語が必要です...その後、正しいものを挿入します。たとえば、ベースペアテーブルのアイテム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);
私は単純化しすぎているかもしれませんが、説明は場所によって曖昧に思えます。