2016-04-16 15 views
0

午後、SQLが2つのテーブルと1つの条件を満たす要素を結合する

私が参加しようとしている2つのテーブルに問題があります。

私がしようとしているのは、いくつかの議題(codControl)に登録されているすべての製品を使ってテーブルを印刷しなければならないためです。

しかし、最初に私はlctocotacaoを調べて、彼がすでにいくつかの製品に価格を与えていたかどうかを調べる必要があります。しかし、私がこれをするとき、私はちょうどある価格を持っている製品と、私が見ていないものを手に入れます。ここで

は、私は現時点では、このSQL文を持っている私のテーブルcadprodutoscotacao

codProduct  desc  codControl 
1    abc  197 
2    cde  197 
3    fgh  197 
1    abc  198 

そして、私のテーブルlctocotacao

codProduct  price  codControl codPerson 
1    2.5000 197   19 
2    3.0000 197   37 
3    4.5000 198   37 

の例である:

SELECT cadc.cod, cadc.desc, lcto.codEnt, lcto.price 
FROM cadprodutoscotacao cadc JOIN lctocotacao lcto 
ON cadc.codControl = lcto.codControl 
AND cadc.codProduct = lcto.codProduct 
AND cadc.codControl = '197' 
AND lcto.codPerson = '19' 
ORDER BY cadc.codControl; 
cod  desc  price  codPerson  codControl 
1  abc  2.5000 19   197 

を、表には、私は私のクエリへのパラメータとなります

cod  desc  price  codPerson  codControl 
1  abc  2.5000 19   197 
2  cde        197 
3  fgh        197 

197と19を期待:私は取得しています何。

進歩上のアイデアはありますか?

E D I T

基本的に、私は2つのクエリがあります:議題 '197' に登録されているすべての製品を返すために、この最初の

SELECT * 
FROM cadprodutoscotacao 
WHERE cadc_codControl = '197' 

を。

2つ目:

SELECT * 
FROM lctocotacao 
WHERE codPerson = 19 
AND codControl = '197' 

すべて含め、すでに私は1つのテーブルを返す必要が議題197

者19で追加されたいくつかの価格を持っていた製品を、戻すには、この第二1レコードを最初のクエリから取得し、2番目のクエリに価格がある場合は、それらを連結する必要があります。事前に

Example

感謝。

+0

あなたは 'left join'を探しています: –

+0

わかりません。私はちょうどイメージを追加した、私はあなたが今何を期待しているのかを見ることができると思う。 –

+0

それは助けになるか分かりません...非常に不明なことがあります:あなたは人物19を具体的に検索しますが、人物37の結果が欲しいです... **あなたは**価格を連結したいと言っていますが、あなたの結果に表示される2,50は人37の価格に対応し、横の列には人19が表示されます...私は分かりません。 –

答えて

2

あなたはLEFT JOINが必要ですが、あなたはまた、フィルタリング条件に注意する必要があります。

SELECT cadc.cod, cadc.desc, lcto.codEnt, lcto.price 
FROM cadprodutoscotacao cadc LEFT JOIN 
    lctocotacao lcto 
    ON cadc.codControl = lcto.codControl AND 
     cadc.cod = lcto.cod AND 
     lcto.codEnt = '19' 
WHERE cadc.codControl = '197' 
ORDER BY cadc_codigo; 

LEFT JOINは、ONの条件に一致するかどうかにかかわらず、最初のテーブルのすべての行を保持します。これは、最初のテーブルと2番目のテーブルの条件に適用されます。したがって、ON句の最初のテーブルにフィルタを置く必要はありません。

ルールは次のとおりです。LEFT JOINを使用する場合は、WHERE句の最初のテーブルにフィルタを置きます。 2番目のテーブルのフィルタはON句に入ります(そうでない場合、外部結合は一般的に内部結合に変わります)。

+0

これはまさに私が探しているものです!それはinteretingアプローチです。 ご協力いただきありがとうございます! –

-1

私はあなたの例を理解していません。主キーとは何ですか? "cod"と "codentry"が両方のテーブルに表示されます。あなたのスキーマは非常に冗長であるようです。

誰かが参加していくつかのエントリが欠落している場合は、LEFT OUTER JOINを使用して解決できます。あなたは、左テーブルからすべてのレコードをしたい場合はINNER JOIN

ためのショートカットですJOINを、指定されたので、彼らは右のテーブル内のレコードを相関関係がない場合でも

+0

'cod'は各テーブルの自動インクリメントキーです。 私は、3番目のテーブルから来るcodEntを使ってそれらをフィルタリングしなければなりません。なぜなら、私のweb-app –

+0

のセッションでこのcodEntを取得するのですが、なぜ自動インクリメント値をお互いに比較しますか? – Mick

+0

申し訳ありませんが、私の間違いです。自動インクリメントではありません。彼らはProduct codです。 最後に更新しましたが、今は分かりやすいと思います。 –

0

あなたの行は、あなたがすべき、ろ過されていますLEFT JOINの操作を行います。

SELECT cadc.cod, cadc.desc, lcto.codEnt, lcto.price 
FROM cadprodutoscotacao cadc 
LEFT JOIN lctocotacao lcto 
ON cadc.codControl = lcto.codControl 
AND cadc.cod = lcto.cod 
AND cadc.codControl = '197' 
AND lcto.codEnt = '19' 
ORDER BY cadc_codigo; 
+0

問題JOINのは、それが**私に** cadprodutoscotacao内のすべてのレコードを返すことであり、私はこのクエリ内にあるものだけを必要とする: は 'cadc_codcotacao =「cadprodutoscotacao * FROM を選択197'' –

+0

オリジナルの質問のデータを変更しましたか? 'cadprodutoscotacao'に' '4、 'ijk'、198'というレコードがありましたが、もうそれは見えません。私はあなたのテーブル構造に深刻な問題を抱えています。なぜなら、テーブル/カラムの名前はまったく意味がないから、これは私をたくさん混乱させるからです。私はこれをSQLfiddleに入れました。別のクエリが来るでしょう。 –

+0

うん!この「cadprodutoscotacao」は、すべての議題に登録されているすべての製品を含む表です。 同じ製品が複数の議題に含まれる可能性があるので、codProductを繰り返すことができます。 –

関連する問題