2つのテーブルクエリの値を一致させる(SQLおよびColdFusion)

StackOverflow https://stackoverflow.com/questions/205697

  •  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);

私は単純化しすぎているかもしれませんが、説明は場所によって曖昧に思えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top