2012-01-31 6 views
3

だから私は人々と1つのテーブルを持っています。 1つのテーブルにはアイテムが置かれ、1つにはアイテムが必要です。売り手と買い手を照合するSQLクエリ

私は、特定のユーザーのための交換提案を返すクエリが必要です。

私は人物Aの意見を交換したいのであれば、人物Aが望むアイテムを放棄している人のリストを返すべきであり、人物Aが譲渡しているアイテムがほしいと思う。 結果には次のものが含まれていなければなりません:Person Aのアイテム、人物の名前もidとitem_IDと交換します。私は何が必要なのこのようなものだと思い

答えて

1

は正しいはずです。しかし、それは売り手の名前を取得しないし、(私の意見では)避けるべきである構文を使用します。だから、ここで代替がある

...

SELECT 
    buyer.name   AS buyer, 
    buyerWants.name  AS buyer_wants,  (assuming the items have names), 
    buyerHas.name  AS buyer_has, 
    seller.name   AS seller, 
    sellerWants.name AS seller_wants, 
    sellerHas.name  AS seller_has 
FROM 
    People    AS buyer 
INNER JOIN 
    Wishlist   AS buyerWants 
    ON buyerWants.person_id = buyer.person_id 
INNER JOIN 
    Giveaways   AS sellerHas 
    ON sellerHas.item_id = buyerwish.item_id 
INNER JOIN 
    People    AS seller 
    ON seller.person_id = sellerHas.seller_id 
INNER JOIN 
    WishList   AS sellerWants 
    ON sellerWants.person_id = seller.person_id 
INNER JOIN 
    GiveAways   AS buyerHas 
    ON buyerHas.item_id = sellerWants.item_id 
    AND buyerHas.person_id = buyer.person_id 
WHERE 
    buyer.person_id = ? 
+0

ありがとう!しかし、これは、ユーザーが望むアイテムを放棄しているすべての人々を返すようです。ユーザーが離れているアイテムを欲しがっている人だけでなく、 – LarsJK

+0

あなたはそのsintaxを避けるべき理由をあなたの答えに加えることができますか?私の仕事では、これは読書のほうがはるかに優れていると考えています。これはパフォーマンスが変わらないことを私たちが知っています(少なくともOracleでは)。ありがとう。 –

+0

@SérgioMichels - それは長い会話で、私はまだそれについてここに質問があると確信しています。私の '短い'(ish)答えは...(技術的)複数の内部/外部結合を実装する場合、外部結合表記はそれをあいまいにします。 (プレゼンテーション)複雑なANSI-92では、それが古い表記法であることを理解するのがずっと簡単です。これにより、保守やデバッグが容易になります。 '、'表記*はしばしばコンパクトですが、特に単純なクエリの場合はコンパクトです。しかし、最悪の場合のシナリオは、ANSI-92の最悪のシナリオよりもずっと悪いことがよくあります。 – MatBailie

0

:SérgioMichels'答え@

select p.* 
    , w.item_id item_wanted 
    , g.person_id person_giveaway 
    from People p 
    , Wishlist w 
    , Giveaways g 
where p.person_id = ? 
    and p.person_id = w.person_id 
    and g.person_id != p.person_id 
    and g.item_id = w.item_id 
    and exists(select 1 
       from Wishlist w1 
        , Giveaways g1 
       where g1.person_id = p.person_id 
        and g1.item_id = w1.item_id 
        and w1.person_id = g.person_id) 
+0

ありがとう!しかし、これは、ユーザーが望むアイテムを放棄しているすべての人々を返すようです。ユーザーが譲っているアイテムを望むだけでなく、.. – LarsJK

+0

@Larsaronenは私の編集を参照してください。私は存在節を追加します。 –

+0

-1:実際にはJOIN文を使用し、サブクエリが不要な場合は使用しないことをお勧めします。より良いコーディング手法を育成してください(デモの記事を参照)。 –

0
select 
     AllGiveWish.WhichWay, 
     AllGiveWish.Item_ID, 
     p1.Name as MainPersonName, 
     p2.Name as OtherPersonName 
    from 
     (select 
       "Give" as WhichWay, 
       G.Item_ID, 
       G.Person_ID as MainPerson, 
       W.Person_ID as OtherPerson 
      from 
       GiveAways G 
       JOIN WishList W 
        on G.Item_ID = W.Item_ID 
      where 
       G.Person_ID = YourSinglePersonParm 
     UNION ALL 
     select 
       "Wish" as WhichWay, 
       W.Item_ID, 
       W.Person_ID as MainPerson, 
       G.Person_ID as OtherPerson 
      from 
       WishList W 
       JOIN GiveAways G 
        on W.Item_ID = G.Item_ID 
      where 
       W.Person_ID = YourSinglePersonParm) As AllGiveWish 

     join People P1 
      on AllGiveWish.MainPerson = P1.Person_ID 

     join People P2 
      on AllGiveWish.OtherPerson = P2.Person_ID 
関連する問題