2

SQLServer2008を使用しています。

の違いは何ですか:

Where条項に条件があります

select customer.Id,
       order.Id
  from Customer customer
      left outer join Order order on order.customerId = customer.Id
  where 
      order.deleted =0

ON条項の条件付き

select customer.Id,
       order.Id
  from Customer customer
      left outer join Order order 
           on order.customerId = customer.Id 
           and order.deleted =0

そして、2つはどのように比較しますか

select customer.Id,
       order.Id
  from Customer customer
      inner join Order order on order.customerId = customer.Id
  where 
      order.deleted =0
4

4 に答える 4

0

それらすべてをSSMSのクエリウィンドウに配置し、入力してctrl+l(または、クエリの実行後に実際の実行プランを表示するオプションをオンにして)、SQLが生成するプランを確認します。それがどのように違うかを教えてくれます。SQLは、クエリを最適に実行するための決定を行います。これは、システム(つまり、インデックスなど)によって異なります。

LEFT JOINを実行すると、SQLが「ねえ、LEFT JOINと言っていますが、WHERE句は基本的にINNER JOINのように機能します」と言って、修正/最適化しない限り、異なる実行プランになる可能性があります。

于 2012-12-05T19:55:57.510 に答える
0

私はあなたがについて学ぶべきだと思いますsql joins。ここから始めるのに良いリンクがあります。

基本的に、

  • ケース1 :そのままフィルタリングorder.deleted =0しています。右側のテーブルにマッピング行がない場合、そのテーブルの列はnullになります。またはのようにする必要がありますnullright table of a left joinISNULL(order.deleted,0)=0order.delete IS NULL or order.delete=0

  • ケース2ON2つのテーブルが結合され、結合前に条件order.deleted =0がチェックされる(私が思う)条件です。

  • ケース3JOIN or INNER JOIN :正確な行が両側からマッピングされる単純な

于 2012-12-05T20:01:06.807 に答える
0

2つのテーブルを用意しましょう

お客様

ID  
1   
2   
3   

注文

ID  Customer
------------    
1   1
2   2
3   2

顧客3には注文がありません。

また、テーブル内の列CUSTOMERへの左結合が行われると、顧客3ではnullになります。したがって、条件がwhereステートメントにある場合、注文のない顧客は返されません。条件が「オン」の場合、それらの注文は含まれません。ORDERORDER

于 2012-12-05T20:02:33.683 に答える
0

具体的にあなたの質問に答えさせてください。

最初のクエリと3番目のクエリは、実行プランではない場合でも、結果が同じです。このwhere句は、の2番目のテーブルのフィールドを調べていますleft outer join。最初のテーブルの行で、2番目のテーブルではない行は、NULL値を持ち、フィルターで除外されます。

2番目のクエリは、最初のテーブルのすべての行とそのすべての順序(存在する場合)を保持します。

于 2012-12-05T20:09:11.750 に答える