2017-04-18 3 views
0

は、これまでのところ、私は空白を受け付けており、私のクエリですテーブル:SQLクエリ苦境

SELECT AgentName, 
     Salary, 
     Commission, 
     (SELECT sum(Premium) 
     From Policy,PolicyCover 
     WHERE AgentNo IN (Select AgentNo From Policy)) As [Total Premium] 
FROM Agent,Policy,PolicyCover 
WHERE (Select sum(Salary+Commission) 
     From Agent) < 
     (Select Min(Salary) 
     From 
     Agent Where Function= "Manager") 
+7

これらのdbテーブルの構造を投稿してください – gaganshera

+2

先頭にカンマ区切りの結合を使用しないでください。あなたは初心者のようですので、** 1992年**に重複して作成された結合構文を使用するよう教えてくれましたか?次に、同じテーブルから何度も何度も選択しています。サブクエリはメインクエリにも関連していません。 –

+1

テーブル構造の表示を求められました。これをしてください。どの列がどのテーブルに属していますか?テーブルの主キーは何ですか? (ちなみに:MS Accessタグを追加してください。私は編集が保留中ではありません。あなたのDBMSにタグを付けないでSQLの質問をしないでください) –

答えて

0

これほど簡単ではありませんか?

select (salary + commission) "sum of commission and salary" 
from agent 
where (salary + commission) < (select min(salary) from agent where function = 'Manager') 
+0

いいえ私は給与+手数料を表の属性として追加することはできません –

1

あなたは初心者ですので、私は、私はあなたにプレタ-à-Porterのクエリを示した場合、それはそれほど役に立たないだろうと思います。代わりに私はあなたの質問が何をしているか教えてくれるでしょう。

変更された結合構文を使用しています。テーブル名の間のコンマを、明示的なキーワードCROSS JOINに置き換えることができます。だからあなたのメインのクエリがあります。エージェントからすべてのレコードを取り出し、ポリシーからすべてのレコードとそれらをまとめると、結果の行を取得し、すべてのそれらを組み合わせる:

FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover 

に変換し、意味

FROM Agent, Policy, PolicyCover 

をPolicyCoverに記録する。エージェントは100レコード、Policy 200、PolicyCover 300を持っているとします。これにより、100 x 200 x 300の組み合わせ= 6,000,000行になります。 WHERE句に今

WHERE (Select sum(Salary+Commission) From Agent) < 
     (Select Min(Salary) From Agent Where Function = "Manager") 

ですから、エージェントからの給与プラスcommisonの合計を選択します。次に、エージェントからの最低給与を選択します。これはもちろん、すべての給与の合計(手数料に加えて)より少なくなります。したがって、条件は決して満たされません。レコードを選択しません。

条件が満たされたWHERE句があった場合は、組み合わせた行の無数からプレミアム値の合計を加えた列を選択します。そのサブクエリを見てみましょう:あなたはPolicyとPolicyCoverを結合し、すべての組み合わせを作成します。 WHEREでは、Policyテーブルから取得したAgentNoがポリシーテーブルに存在することを確認します。まあ、これはもちろん常に当てはまります。

最初のこと:適切な結合を学習してください(INNER JOIN ... ON ...から始まる)。テーブルと関連するものについて考え、関連するレコード(たとえば、同じポリシー番号のもの)にのみ参加してください。

次のこと:複数のテーブルで作業する場合は、列を修飾することを習慣にしてください。プレミアムは、たとえばPolicyまたはPolicyCoverの列ですか?テーブル名:SUM(PolicyCover.Premium)を指定して、これを明確にします。または、表の別名:FROM PolicyCover pcSUM(pc.Premium)を使用します。

+0

Cross Joinメソッドを使用しようとしましたが、動作しません。 –

+0

「機能しません」と表示されません。あなたは 'FROM Agent、Policy、PolicyCover'を' FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover'に置き換えたときに構文エラーを起こすと言っていますか? –

+0

はい、正確です。私たちは方法でMicrosoft Office Accessを使用するように言われました –