0

複数のテーブル (3 レベル) からデータを取得しようとしています。スキャンナリオは、顧客がエージェントにリクエストを送信し、エージェントがそれを処理することです。顧客の場合、顧客のテーブルがあります

    -----------------------------------------
    customerid | customername | fk_personid
       1       |     abc      |     1
       2       |     xyz      |     4
    ------------------------------------------

顧客は、それを処理するエージェントにリクエストを送信します

   ----------------------------------------
    agnetid    | agentname    | fk_personid
       6       |     asd      |     1
       7       |     fgh      |     4
    ---------------------------------------

上記の両方のテーブルは、親テーブル person を介して接続されています

   ------------------------------------------
    personid   | personname   |  personemail 
       1       |     abc      |    as@m.com
       2       |     xyz      |    vb@df.com
    -----------------------------------------

現在、両方の外部キーが要求テーブルの複合 PK である Request のような別のテーブル名があります

    ------------------------------------------
    FK_custmid |   FK_agentid |  requestype 
       1       |       1      |    type one
       2       |       2      |    type two
    -----------------------------------------

最後に、FK を介してリクエスト テーブル (親) に接続されている 6 つの異なるタイプのリクエストがあります。以下は、シングルタイプの残りの1つの表です。残りはすべて同じです。以下の表では、上記の複合 PK は FK です。

   -----------------------------------------------------------
    req_id  |  req_FK_custmid | req_FK_agentid |  requestype 
       1    |        1        |       1        |   type one
       2    |        2        |       2        |   type two
    ----------------------------------------------------------

ああ、これらすべてのテーブルを念頭に置いて、リクエストによって生成された顧客に関する詳細を表示する必要があります。

  -------------------------------------------------
   req_id | requestype |  customer_id | agent_id 
     1    |   type one |      1       |    1
  -------------------------------------------------

皆さんが私の主張を理解し、解決策を見つけるのを手伝ってくれることを願っています。私も自分のように試してみました

  SELECT * FROM Agent,Request,Person,customer where Request.customer_idcutomer = customer.idcustomer and Request.Agent_idAgent = Agent.idAgent and Person.idPerson = customer.Person_idPerson and Person.idPerson = Agent.Person_idPerson

別のアプローチは、これをさらに完了する方法がわからなかったため、不完全です。クエリの最後の部分の1はハードコードされているはずですが、getがどのように動的かわかりません

  SELECT request.SPOC_id, request.order_created, request.order_updated
  FROM request
  WHERE Agent_idAgent = ( 
  SELECT agent.idAgent
  FROM agent
  WHERE agent.idAgent =1 ) 
  LIMIT 0 , 30

私が試した他のアプローチはたくさんありますが、どれも私が望むものを与えてくれませんでした。

注:クエリに表示されるフィールドがいくつかありますが、時間を節約するために上記の表には記載していません。入力したデータはすべてダミーであり、互いに同期されていない可能性があります。

注:テーブルとその接続構造を変更するよう提案された場合は、私に知らせて、間違っているかどうかを教えてください。

4

1 に答える 1

1

内部クエリを使用する代わりに、結合を使用します。

ハードコーディングされたクエリに基づいて、答えは次のようです

SELECT request.SPOC_id, request.order_created, request.order_updated
FROM request inner join agents 
ON agents.idAgent = request.FK_agentid
WHERE Agent_idAgent = 1
LIMIT 0 , 30

このクエリをより一般的にするには、ハードコードされた '1' をパラメーターに置き換える必要があります (構文は異なる場合があります)。

SELECT request.SPOC_id, request.order_created, request.order_updated
FROM request inner join agents 
ON agents.idAgent = request.FK_agentid
WHERE Agent_idAgent = :p1
LIMIT 0 , 30

パラメータをどのように使用しますか? クエリは、おそらく何らかのプログラミング言語から呼び出されています。Delphi では、次のように記述します。

with MyQuery do
 begin
  parambyname ('p1').asinteger:= 7;
  open;
  ...
  close
 end;

これにより、エージェント 7 のすべてのリクエストが取得されます。このテーブルの設計では、エージェントに名前を付けることができないため (名前は Person テーブルにあります)、エージェントのすべてのリクエストを取得する方法を示すのはより困難です。その名前は kwk.stack です。

SELECT request.SPOC_id, request.order_created, request.order_updated
FROM request inner join agents 
ON agents.idAgent = request.agent_agentid
inner join person on person.idperson = agents.person_idperson
WHERE person.name = 'kwk.stack'

上記は、最初に尋ねられたときの質問に基づいています。質問への編集は、上記が尋ねられた質問にもはや答えないことを意味するかもしれません.

テーブルの名前を変更することを強くお勧めします - これらは通常、People、Agents、Requests などの複数形です - テーブル内のフィールド名 - 「agent_agentid」を「agent」に置き換えます。「person_idperson」と「person」など

于 2013-09-25T07:35:09.317 に答える