Внешнее соединение с AndExpression - PullRequest
0 голосов
/ 22 апреля 2009

Возможно ли в 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] = 2 и WHERE [orders].[deptid] = 2, что, конечно же, приведет к двум различным наборам результатов.

Это что-то, что я могу сделать с SubSonic вообще или запрос SubSonic, который я сделал, неправильный?

Спасибо за любую помощь !!

Редактировать: Например, у меня 2 клиента, у 1 есть несколько заказов, а у второго нет. Пример данных только с соединением (SELECT customerid, orderid, deptid FROM [customer] LEFT OUTER JOIN [orders] ON [customer]. [Customerid] = [orders]. [Customerid]) вернет это:

Строка A: Customerid 1, Orderid 1, Deptid 2

строка B: индекс 0, код 2, элемент 1

строка C: значение 0, значение NULL, значение NULL

SQL с оператором AND вернет строки A и C. Я полагаю, это потому, что AND вычисляется в процессе объединения.

SQL с оператором WHERE будет возвращать только строку A, потому что WHERE вычисляется после объединения, а затем только строка A имеет Deptid 2.

1 Ответ

0 голосов
/ 22 апреля 2009

Ключ - это разница в AND [orders]. [deptid] = 2 и ГДЕ [orders]. [deptid] = 2, который выключен Курс приведет в 2 разных результирующие.

Оба вернут один и тот же набор результатов. Может быть какая-то разница в производительности, но я так не думаю. как современная база данных, оптимизируйте запрос лучше.

...