Чтобы упростить ситуацию, моя ситуация представляет собой ситуацию с двумя таблицами с отношением «один ко многим» (или, возможно, «один к одному» в некоторых случаях): например, счета и платежи, размещенные клиенты и заказы и т. д. Каждый платеж/заказ может быть связан только с одной учетной записью, но у учетной записи может быть ноль, 1 или несколько платежей, связанных с ней. Если я хочу, чтобы вычислить общее количество платежей/заказы на каждый счет/клиент, я бы написать что-то вроде этого:SQL: join vs где
Select c.clientid
,coalesce(o.NumOrders,0) as NumOrders
From clients c
Left outer join
(select clientid, count(*) as NumOrders from orders group by clientid) o
on c.clientid = o.clientid
Однако, я также видел этот тип кодирования:
Select c.clientid
, (select count(orders.clientid) from orders where orders.clientid = c.clientid) as NumOrders
From clients c
Есть ли у вас замечания относительно того, какой подход был бы предпочтительным и почему?
Я считаю, что последнее труднее читать, но, возможно, это просто моя привычка. Что касается производительности, кажется, что первая быстрее, если у меня нет предложения where, но если у меня есть предложение where (например, условие, которое возвращает только 1000 записей из таблицы клиентов с 2,2 миллионами записей), то последнее кажется более быстрым.
Я использую PostgreSQL 9.1 и Microsoft SQL Server 2014. Благодарю вас!
просто перепроверить запрос план выполнения –
вы ответите yourselve, используйте 'join' для объединения таблиц и' where' положение, чтобы ограничить область, чтобы получить меньше записей. – Aramillo
, поэтому вам не нужно присоединяться к этому примеру. Вы можете просто выбрать o.clientid, count (*) из заказов o group по o.clientid –