2012-05-10 6 views
0

、私が使用しているクエリは次のとおりです。MySQLのテーブルUNIONのISSUE

SELECT qa_invoicesitems.item_code, qa_invoicesitems.item_unitprice, qa_invoicesitems.item_subtotal, qa_invoicesitems.item_discount, 
qa_invoicesitems.item_total 
FROM qa_invoicesitems 
RIGHT JOIN qa_invoicesitems_returnlog USING (item_code) 
WHERE invoice_code = 17 
UNION 
SELECT qa_invoicesitems_returnlog.item_code, qa_invoicesitems_returnlog.item_unitprice, qa_invoicesitems_returnlog.item_subtotal, 
qa_invoicesitems_returnlog.item_discount, qa_invoicesitems_returnlog.item_total 
FROM qa_invoicesitems_returnlog 
LEFT JOIN qa_invoicesitems USING (item_code) 
WHERE returnlog_code = 9 

しかし、私は望ましい結果を見張ることができません。

グラフィカル例.. enter image description here

誰もが、私はこの結果を得ることができる方法任意のアイデアを持っていますか?
注: qa_invoicesitems_returnlogデータを置き換えます。

コード:1234,1585,23は両方のテーブルに存在するため、(qa_invoicesitems_returnlog)から取得され、残りは単純に表示されます。 enter image description here

+0

私は質問を理解するかどうかを見てみましょう。あなたは2つのテーブルを照会したいのですが、どこに行が存在するのかは、2つ目のテーブルの行だけを返しますか? – JohnFx

+0

正確には、(item_code)が両方のテーブルで見つかった場合は、2番目のテーブルの行に置き換えてください。 –

+0

元の質問を編集して、必要なものを明確にすることはできますか? –

答えて

1

、私はあなたが欲しいと言うつもりです:

  • テーブルでqa_invoicesitems_returnlog = 9
  • すべての行1どこinvoice_code = 17、ものを除き表2のすべての行だから、テーブルからの出力にすでに存在しているitem_id年代2.

/wの行は、労働組合としてのことを書き出す、あなたを与える:

SELECT qa_invoicesitems_returnlog.item_code as item_code, 
     qa_invoicesitems_returnlog.item_unitprice as item_unitprice, 
     qa_invoicesitems_returnlog.item_subtotal as item_subtotal,   
     qa_invoicesitems_returnlog.item_discount as item_discount, 
     qa_invoicesitems_returnlog.item_total as item_total 
FROM qa_invoicesitems_returnlog 
WHERE qa_invoicesitems_returnlog.returnlog_code = 9 
UNION 
SELECT qa_invoicesitems.item_code as item_code, 
     qa_invoicesitems.item_unitprice as item_unitprice, 
     qa_invoicesitems.item_subtotal as item_subtotal,   
     qa_invoicesitems.item_discount as item_discount, 
     qa_invoicesitems.item_total as item_total 
FROM qa_invoicesitems 
WHERE qa_invoicesitems.invoice_code = 17 
    AND NOT EXISTS (SELECT * FROM qa_invoicesitems_returnlog qir2 
        WHERE qir2.returnlog_code = 9 
         and qir2.item_code = qa_invoicesitems.item_code) 

キーは、テーブル2の出力に既に存在するテーブル1(qa_invoiceitems)の結果から除外され、一致するitem_codeを持つNOT EXISTS句です。

+0

あなたは私のヒーローです。ちょっとしたエラー(そしてqir2.item_code = qa_invoicesitems.item_code) で終わりますが、クエリで必要なデータが返されます。 + REP –

+0

ようこそ。エラーは、 'qa_invoicesitems'にsがありませんでしたか?そのタイプミスを修正しました。 –

+0

yup =]もう一度ありがとうございます。 –

1

なぜUNIONを使用していますか?私はあなたのクエリに相当すると思います:

SELECT qa_invoicesitems.item_code, qa_invoicesitems.item_unitprice, 
     qa_invoicesitems.item_subtotal, qa_invoicesitems.item_discount, 
     qa_invoicesitems.item_total 
FROM qa_invoicesitems RIGHT JOIN 
    qa_invoicesitems_returnlog 
    USING (item_code) 
WHERE invoice_code = 15 or returnlogcode = 8 

テーブルが逆転しているので、LEFTとRIGHTの結合は同じことをしています。あなたのコメント&あなたのイメージに基づいて

+0

WHERE文をこれに設定します(WHERE invoice_code = 17 AND qa_invoicesitems_returnlog.returnlog_code = 9)が、まだ必要な行を取得できません –

+0

私はこのクエリが元のクエリと同等であると信じています。しかし、それはあなたが望むものとまったく同じではありません。どのようにしてテーブル間の重複を判断していますか? –