1

次の状況で問題が発生しています: 2 つの一時テーブルを作成するクエリがあり、次のように選択してそれらを結合します。

    SELECT * FROM result 
    INNER JOIN result2 ON result2.packetDetailsId = result.packetDetailsId

次に、結果のフィールドのいくつかを連結して別の列を作成し、それを使用して別のテーブルに対して参照/クエリを実行しようとしています。1 つのクエリでこれを達成する方法はありますか? 一時テーブルから離れるべきですか?

よろしくお願いします。


更新: 2 つの一時テーブルの組み合わせにエイリアスを設定しようとすると、[Err] 1060 - Duplicate column name 'packetDetailsId' というエラー メッセージが表示されます

    select * from (
    SELECT * FROM result 
    INNER JOIN result2 ON result2.packetDetailsId = result.packetDetailsId) as myalias

別の更新: ほぼ 1 つのクエリとして機能していますが、結合した列に "(BLOB)" という結果が表示されます:

       select packet_details.packetDetailsId,products.productId,Credit,AccountNum,OrderStat,          CONCAT(products.productId,Credit,'_',OrderStat) as consol from (
    select packetDetailsId, GROUP_CONCAT(Credit) AS Credit, GROUP_CONCAT(AccountNum) AS AccountNum, GROUP_CONCAT(OrderStat) AS OrderStat FROM
 ( SELECT pd_extrafields.packetDetailsId,
CASE WHEN pd_extrafields.ex_title LIKE ('%Credit%') 
THEN pd_extrafields.ex_value ELSE NULL END as Credit,
CASE WHEN pd_extrafields.ex_title LIKE ('%Account%') 
THEN pd_extrafields.ex_value ELSE NULL END as AccountNum,
CASE WHEN pd_extrafields.ex_title LIKE ('%Existing%') 
THEN pd_extrafields.ex_value ELSE NULL END as OrderStat
FROM pd_extrafields  )AS TempTab GROUP BY packetDetailsId ) as alias2

    INNER JOIN packet_details ON alias2.packetDetailsId = packet_details.packetDetailsId

内部結合 sales ON packet_details.packetDetailsId = sales.packetDetailsId

内部結合 sold_products ON sales.saleId = sold_products.saleId 内部結合 products ON sold_products.productId = products.productId

4

2 に答える 2

2

私の理解が正しければ、すでに一時テーブルが作成されており、次を使用して結果を「連結」する必要があります。from ... inner join ...

考えられる唯一の制限は、句内で一時テーブルを 1 回しか参照できないことです。fromそれ以外に、他の制限はありません (最終結果を作成する際の中間ステップとして一時テーブルを頻繁に使用します)。


チップ

あなたの一時テーブルがtemp_result1temp_result2. 両方のテーブルにはpackedDetailsId、結合が実行されるフィールドがあります。各テーブルに適切なインデックスを作成することを忘れないでください。少なくともpackedDetailsId、両方のテーブルにインデックスを付ける必要があります。

alter table temp_result1
    add index PDI(packedDetailsId);
alter table temp_result2
    add index PDI(packedDetailsId);

ここで、目的の結合と連結を使用してクエリを実行するだけです。concatを返す場合BLOB、結果を次のようにキャストしますchar(もちろん、テキスト文字列が必要だと仮定しています):

select r1.*, r2.*, cast(concat(r1.field1, ',', r2.field2) as char) as data_concat
from temp_result1 as r1
    inner join temp_result2 as r2 on r1.packedDetailsId = r2.packedDetailsId;

あなたの問題は値GROUP_CONCATを返すことだと思います...それは正常です(MySQLは値を返す方法をアプリオリBLOBに知らないため、バイナリデータを返します)。関数を使用するだけです。cast

これがお役に立てば幸いです

于 2013-03-11T19:47:56.470 に答える
0

そのため、result2 と結果が両方とも一時テーブルである場合、ローカル一時テーブルの場合は # を、グローバル一時テーブルの場合は ## を含める必要があります。

したがって、ステートメントは次のようになります。

SELECT * FROM #result 
INNER JOIN #result2 ON #result2.packetDetailsId = #result.packetDetailsId

私の悪い。これは、MS SQL にのみ適用されます

于 2013-03-11T19:51:37.957 に答える