0

SubSonicでこのようなクエリを作成することは可能ですか?

SELECT * FROM [customer] 
LEFT OUTER JOIN [orders] ON [customer].[customerid] = [orders].[customerid] 
AND [orders].[deptid] = 2

私は次のSubSonic(2.1)コードでこれを試しました:

SqlQuery q = DB.Select().From<Customer>()
    .LeftOuterJoin(orders.customerid, customer.customerid)
    .AndExpression(orders.deptid).IsEqualTo(2);

SQLプロファイラーで生成されたクエリを見ると、次のようになっています。

SELECT * FROM [customer] 
LEFT OUTER JOIN [orders] ON [customer].[customerid] = [orders].[customerid] 
WHERE [orders].[deptid] = 2

重要なのはとの違いですAND [orders].[deptid] = 2WHERE [orders].[deptid] = 2これはもちろん、2つの異なる結果セットになります。

これは私がSubSonicでできることですか、それとも私が作成したSubSonicクエリが正しくありませんか?

助けてくれてありがとう!

編集:たとえば、私には2人の顧客がいて、1人には複数の注文があり、2番目の顧客には何もありません。結合のみのデータの例(SELECT customerid、orderid、deptid FROM [customer] LEFT OUTER JOIN [orders]ON[customer]。[customerid]=[orders]。[customerid])はこれを返します:

行A:customerid 1、orderid 1、deptid 2

行B:customerid 1、orderid 2、deptid 1

行C:customerid 2、orderid NULL、deptid NULL

ANDステートメントを含むSQLは、行AとCを返します。これは、ANDが結合プロセス中に評価されるためだと思います。

WHEREステートメントを使用したSQLは、行Aのみを返します。これは、WHEREが結合後に評価され、行Aのみがdeptid2を持つためです。

4

1 に答える 1

-1

重要なのは、AND [orders].[deptid] = 2 と WHERE [orders].[deptid] = 2 の違いです。もちろん、2 つの異なる結果セットになります。

どちらも同じ結果セットを返します。多少の性能差はあるかもしれませんが、私はそうは思いません。最新のデータベースとして、クエリをより適切に最適化します。

于 2009-04-22T10:29:58.830 に答える