2011-08-02 12 views
0

私はSQLクエリを構築するのに助けが必要です。SQLクエリのヘルプ

は、私は2つのテーブルこのフィールドを持つテーブルのプロジェクトや製品を、持っている:

プロジェクト:

  • PROJECTCODE
  • PROJECTNAME

製品:

  • ITEMCODE
  • ITEMNAME
  • PROJECTCODE
  • REPLACEDBYCODE

REPLACEDBYCODEが他のITEMCODE含まれています(意味が、この製品は他の製品に置き換えられています)。製品がまだ交換されていない場合、REPLACEDBYCODEはブランクの値を持ちます。私はこのようなすべての製品についてのレポートを作成したい

ITEMCODE | ITEMNAME | REPLACEDBYCODE | **REPLACED_ITEM_NAME** | PROJECTNAME 

感謝。

+0

ご使用のRDBMS(SQL Server、Oracle、Postgres、MySQLなど)で質問にタグを付けてください。 –

答えて

1

外部結合を使用してPRODUCTに自身を追加する必要があります。つまり、クエリはすべてのアイテムを返し、置換コードを持つそれらのテーマの新しい名前を表示します。

select p1.itemcode 
     , p1.itemname 
     , p1.replacedbycode 
     , p2.itemname replaced_item_name 
from product p1 
     left outer join product p2 
      on p1.replacedbycode = p2.itemcode 
/

注:これはANSIの結合構文です。 RDBMSのいくつかのフレーバには、Oracle 9iなどの外部結合の代替構文があります。

+0

ありがとう、それは動作します! – ewlung

1

あなたが自分自身にテーブルを結合することができます。

SELECT p.itemcode, p.itemname, p.replacedbycode, r.itemname, j.projectname 
FROM product as p JOIN product as r ON(p.replacedbycode = r.itemcode) 
        JOIN project as j ON(p.projectcode = j.projectcode); 

あなたは、その後、あなたがするCOALESCEを使用することができますデータベースを使用するために、より慣用的な方法であるreplacedbycodeではなく、ブランクよりacutally nullであることを慣例を、使用している場合後者の場合には、私は指定されず、代替手段がない行が含まれるように、左外部結合を使用していることを

SELECT p.itemcode, p.itemname, p.replacedbycode, COALESCE(r.itemname, "no replacement"), j.projectname, 
FROM product as p LEFT JOIN product as r ON(p.replacedbycode = r.itemcode) 
        JOIN project as j ON(p.projectcode = j.projectcode); 

注:代替はありません項目がない場合には、かなりのエラーメッセージを印刷します。

replacebycode列にはitemcode列に外部キー制約が必要です。この場合、値として空の文字列を置くことさえ禁止すべきです。

+0

今私はCOALESCEについて学んだ。ありがとう。 – ewlung