Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подскажите как избавиться от FULL JOIN в коде / 9 сообщений из 9, страница 1 из 1
27.10.2021, 08:59
    #40107210
Romanov-krd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Всем привет. Чем заменить full outer join для экономии ресурсов

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
SELECT  	ISNULL(t1.AccountingDate, t2.AccountingDate) AS AccountingDate,
						ISNULL(t1.RezonItemID,t2.RezonItemID) as RezonItemID,
              					ISNULL(t1.ClientOrderID, t2.ClientOrderID) AS ClientOrderID,
              					ISNULL(t1.PostingID, t2.PostingID) AS PostingID,
               					ISNULL(t1.Qty, 0) - ISNULL(t2.Qty, 0) AS Qty,
               					ISNULL(t1.BrandID, t2.BrandID) as BrandID,
                				ISNULL(t1.parent_supplier_id, t2.parent_supplier_id) parent_supplier_id,
						ISNULL(t1.MarketplaceSellerID, t2.MarketplaceSellerID) as MarketplaceSellerID,
						ISNULL(t1.parent_supplier_name,t2.parent_supplier_name) as parent_supplier_name
					FROM  				
						(
							select	t1.AccountingDate,
								t1.ClientOrderID,
                       						t1.PostingID,
    								t1.RezonItemID,
								isnull(t2.BrandID,-1) BrandID,
								t2.MarketplaceSellerID,
								coalesce(ps.ParentID ,s.SupplierID) parent_supplier_id,
								ps.Seller_Name as parent_supplier_name,
    								t1.Qty
                		FROM 
                 		   (
                    	    SELECT  AccountingDate,
                                RezonItemID,
                                ClientOrderID,
                                PostingID,
                               sum(Qty) as Qty
                     	   FROM metazonbeeeye.action
                      	  WHERE 1 = 1
                      	  AND ActionTypeID IN (401, 1003)
                      	  AND AccountingGroupID IN (31241000, 11180244043670, 31247000)
                      	  AND AccountingDate >= LAST_DAY(ADD_MONTHS(now(), -16)) +1
                       		 group by	AccountingDate,
                                		RezonItemID,
                                		ClientOrderID,
                                		PostingID
                      			 -- ORDER BY RezonItemID
                  			  ) AS t1
                		inner JOIN DP_team.RezonItem AS t2
                		ON t1.RezonItemID = t2.RezonItemID
                		inner join DP_team.Seller_ID_distinct s 
								on s.MarketPlaceSellerID=t2.MarketplaceSellerID and s.Category_1=t2.CommercialCategoryLevel1Name
								and s.YYYYMM=to_char(t1.AccountingDate,'YYYYMM')
								left join DP_team.Parent_Supplierid ps on ps.SupplierID = s.SupplierID and ps.Category1 =t2.CommercialCategoryLevel1Name
				WHERE t2.MacroBU <> 'Супермаркет'
			) AS t1 
		FULL OUTER JOIN
			(
						select	t1.AccountingDate,
							t1.ClientOrderID,
                       					t1.PostingID,
    							t1.RezonItemID,
                       					isnull(t2.BrandID,-1) BrandID,
    							t2.MarketplaceSellerID,
    							coalesce(ps.ParentID ,s.SupplierID) parent_supplier_id,
    							ps.Seller_Name as parent_supplier_name,
    							t1.Qty
                		FROM 
                   		 (
                      		  SELECT 	AccountingDate,
                            		  	RezonItemID,
                                		ClientOrderID,
                                		PostingID,
                                		sum(Qty) as Qty
                       			 FROM metazonbeeeye.action
                       			 WHERE 1 = 1
                       			 AND ActionTypeID IN (402, 403)
                      			 AND AccountingGroupID IN (31241000, 11180244043670, 31247000)
                        		AND AccountingDate >= LAST_DAY(ADD_MONTHS(now(), -16)) +1
                       			 group by	AccountingDate,
                                			RezonItemID,
                                			ClientOrderID,
                                			PostingID
                      			 -- ORDER BY RezonItemID
                  			) AS t1
               				 inner JOIN DP_team.RezonItem AS t2
              				  ON t1.RezonItemID = t2.RezonItemID
               					inner join DP_team.Seller_ID_distinct s  --данные о селлере
								on s.MarketPlaceSellerID=t2.MarketplaceSellerID and s.Category_1=t2.CommercialCategoryLevel1Name
								and s.YYYYMM=to_char(t1.AccountingDate,'YYYYMM')
								left join DP_team.Parent_Supplierid ps on ps.SupplierID = s.SupplierID and ps.Category1 =t2.CommercialCategoryLevel1Name
								WHERE t2.MacroBU <> 'Супермаркет'
					) AS t2
        ON t1.AccountingDate = t2.AccountingDate AND t1.ClientOrderID = t2.ClientOrderID and t1.PostingID=t2.PostingID
        and  t1.BrandID=t2.BrandID and t1.parent_supplier_id=t2.parent_supplier_id
...
Рейтинг: 0 / 0
27.10.2021, 09:09
    #40107211
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Какие именно ресурсы вы собрались экономить отказом от full join? Как именно вы собрались их экономить? Не путаете ли вы, случайно, cross join и full join?
...
Рейтинг: 0 / 0
27.10.2021, 09:15
    #40107213
Romanov-krd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
uaggster,

Упростить код хочу, там он почти одинаковый только ИД разные выбирает и потом отнимает из одной суммы другую. Да тут именно full join
...
Рейтинг: 0 / 0
27.10.2021, 09:17
    #40107214
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Я бы сделал два запроса (которые джойнятся по FULL) обьединил их UNION
и добавил ключ [key] = 1 для t1 и [key] = 2 для t2
затем сгруппировал по
Код: sql
1.
2.
3.
4.
5.
AccountingDate,
ClientOrderID,
PostingID,
BrandID,
parent_supplier_id


и выбрал по
Код: sql
1.
HAVING [key] = MIN([key])


Но не факт, что это будет оптимальнее.
Думаю, что лучше через временные таблицы - во вторую грузить только то, чего нет в первой.
...
Рейтинг: 0 / 0
27.10.2021, 09:20
    #40107216
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Romanov-krd
он почти одинаковый только ИД разные выбирает

Так и обрабатывайте в выводе суммы условия
Код: sql
1.
ActionTypeID IN (401, 1003)


и
Код: sql
1.
ActionTypeID IN (402, 403)
...
Рейтинг: 0 / 0
27.10.2021, 09:25
    #40107217
Romanov-krd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
SQL2008,

а как их потом вычесть?
Код: sql
1.
ISNULL(t1.Qty, 0) - ISNULL(t2.Qty, 0) AS Qty,
...
Рейтинг: 0 / 0
27.10.2021, 10:04
    #40107224
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Romanov-krd
Всем привет. Чем заменить full outer join для экономии ресурсов

нет возможности проверить и лень такой огромный код шерстить
но если обе части идентичны за исключением отбора сумм, то просто заменить

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
        SELECT  AccountingDate,
				RezonItemID,
                ClientOrderID,
                PostingID,
                --sum(Qty) as Qty
				sum(case when ActionTypeID IN (401, 1003) then Qty else 0 end) Qty1,
				sum(case when ActionTypeID IN (402, 403) then Qty else 0 end) Qty2
		FROM metazonbeeeye.action
        WHERE 1 = 1
			AND ActionTypeID IN (401, 1003, 402, 403)
            AND AccountingGroupID IN (31241000, 11180244043670, 31247000)
            AND AccountingDate >= LAST_DAY(ADD_MONTHS(now(), -16)) +1
            group by	AccountingDate,
						RezonItemID,
                        ClientOrderID,
                        PostingID
                      	-- ORDER BY RezonItemID
		) AS t1
...
Рейтинг: 0 / 0
27.10.2021, 11:25
    #40107252
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Romanov-krd
uaggster,

Упростить код хочу, там он почти одинаковый только ИД разные выбирает и потом отнимает из одной суммы другую. Да тут именно full join

Код: sql
1.
with ...


и фсе будет оккуратненько...
...
Рейтинг: 0 / 0
27.10.2021, 13:37
    #40107339
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подскажите как избавиться от FULL JOIN в коде
Romanov-krd,

создайте инлайн-функцию с параметрами, и используйте её вместо подзапросов.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Подскажите как избавиться от FULL JOIN в коде / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]