Пользователь
Сообщений: 77
Регистрация: 08.10.2015
Всем привет!
В общем, NATURALLEFTOUTERJOIN объединяет две таблицы, которые строятся из одной и той же, но по разному фильтруются (активациями связей).
Читсый NATURALLEFTOUTERJOIN возвращает корректные данные, но почему то сначала идут столбцы правой таблицы, а потом левой... Это неудобно эстетически (данный запрос представляет строки детализации).
И чтобы упорядочить столбцы как мне надо, я использую дополнительную обертку SELECTCOLUMNS.
Но она меняет результат запроса кардинально, контектс со второй таблицы слетает, и в ее столбцах я вижу ровно теже данные, что и в столбцах левой таблицы!!!
Ниже запрос, пример выложить не могу, так как запрос на сервере SSAS Tabular 2017.
Код EVALUATE CALCULATETABLE(
SELECTCOLUMNS(
NATURALLEFTOUTERJOIN(
CALCULATETABLE(
SELECTCOLUMNS('Услуги',
"migration_id",RELATED('orders_migrations'[migration_id])+0,
"A",RELATED('Наряды'[Слой разовой услуги])
),
USERELATIONSHIP('Наряды'[bi_order_id], orders_migrations[bi_order_id_make]),
USERELATIONSHIP('Наряды'[bi_order_id],'services'[bi_order_make_num_list])
),
CALCULATETABLE(
SELECTCOLUMNS('Услуги',
"migration_id",RELATED('orders_migrations'[migration_id])+0,
"B",RELATED('Наряды'[Слой разовой услуги])
),
USERELATIONSHIP('Наряды'[bi_order_id], orders_migrations[bi_order_id_drop]),
USERELATIONSHIP('Наряды'[bi_order_id],'services'[bi_order_drop_num_list])
)
),
"migration_id",[migration_id],
"A",[A],
"B",[B],
),
USERELATIONSHIP('Отчетный период'[date],'orders_migrations'[date_make_report])
)
Физический план запроса из DAX Studio
Скрытый текст
Код
Line Records Physical Query Plan
1 AddColumns: IterPhyOp LogOp=SelectColumns IterCols(3, 4, 5, 6)(''[migration_id], ''[B], ''[A], ''[])
2 LeftOuterJoin: IterPhyOp LogOp=LeftOuterJoin IterCols(3, 4, 5, 6)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], ''[B])
3 AddColumns: IterPhyOp LogOp=SelectColumns IterCols(3, 4, 5)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61])
4 607 Spool_Iterator<SpoolIterator>: IterPhyOp LogOp=Scan_Vertipaq IterCols(19, 95, 140)('Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], 'Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id]) #Records=607 #KeyCols=146 #ValueCols=0
5 607 ProjectionSpool<ProjectFusion<>>: SpoolPhyOp #Records=607
6 VertipaqResult: IterPhyOp #FieldCols=3 #ValueCols=0
7 Add: LookupPhyOp LogOp=Add LookupCols(140)('orders_migrations'[migration_id]) Double
8 ColValue<'orders_migrations'[migration_id]>: LookupPhyOp LogOp=ColValue<'orders_migrations'[migration_id]>'orders_migrations'[migration_id] LookupCols(140)('orders_migrations'[migration_id]) Double
9 Constant: LookupPhyOp LogOp=Constant Integer 0
10 9 Spool_MultiValuedHashLookup: IterPhyOp LogOp=CalculateTable LookupCols(3)(''[migration_id]) IterCols(4)(''[B]) #Records=9 #KeyCols=2 #ValueCols=0
11 9 AggregationSpool<GroupBy>: SpoolPhyOp #Records=9
12 AddColumns: IterPhyOp LogOp=SelectColumns IterCols(3, 4)(''[migration_id], ''[B])
13 9 Spool_Iterator<SpoolIterator>: IterPhyOp LogOp=Scan_Vertipaq IterCols(95, 140)('Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id]) #Records=9 #KeyCols=146 #ValueCols=0
14 9 ProjectionSpool<ProjectFusion<>>: SpoolPhyOp #Records=9
15 VertipaqResult: IterPhyOp #FieldCols=2 #ValueCols=0
16 Add: LookupPhyOp LogOp=Add LookupCols(140)('orders_migrations'[migration_id]) Double
17 ColValue<'orders_migrations'[migration_id]>: LookupPhyOp LogOp=ColValue<'orders_migrations'[migration_id]>'orders_migrations'[migration_id] LookupCols(140)('orders_migrations'[migration_id]) Double
18 Constant: LookupPhyOp LogOp=Constant Integer 0
19 ColValue<''[migration_id]>: LookupPhyOp LogOp=ColValue<''[migration_id]>''[migration_id] LookupCols(3)(''[migration_id]) Double
А вот без SELECTCOLUMNS:Код Line Records Physical Query Plan
1 LeftOuterJoin: IterPhyOp LogOp=LeftOuterJoin IterCols(3, 4, 5, 6)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], ''[B])
2 AddColumns: IterPhyOp LogOp=SelectColumns IterCols(3, 4, 5)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61])
3 607 Spool_Iterator<SpoolIterator>: IterPhyOp LogOp=Scan_Vertipaq IterCols(19, 95, 140)('Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], 'Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id]) #Records=607 #KeyCols=146 #ValueCols=0
4 607 ProjectionSpool<ProjectFusion<>>: SpoolPhyOp #Records=607
5 VertipaqResult: IterPhyOp #FieldCols=3 #ValueCols=0
6 Add: LookupPhyOp LogOp=Add LookupCols(140)('orders_migrations'[migration_id]) Double
7 ColValue<'orders_migrations'[migration_id]>: LookupPhyOp LogOp=ColValue<'orders_migrations'[migration_id]>'orders_migrations'[migration_id] LookupCols(140)('orders_migrations'[migration_id]) Double
8 Constant: LookupPhyOp LogOp=Constant Integer 0
9 9 Spool_MultiValuedHashLookup: IterPhyOp LogOp=CalculateTable LookupCols(3)(''[migration_id]) IterCols(4)(''[B]) #Records=9 #KeyCols=2 #ValueCols=0
10 9 AggregationSpool<GroupBy>: SpoolPhyOp #Records=9
11 AddColumns: IterPhyOp LogOp=SelectColumns IterCols(3, 4)(''[migration_id], ''[B])
12 9 Spool_Iterator<SpoolIterator>: IterPhyOp LogOp=Scan_Vertipaq IterCols(95, 140)('Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id]) #Records=9 #KeyCols=146 #ValueCols=0
13 9 ProjectionSpool<ProjectFusion<>>: SpoolPhyOp #Records=9
14 VertipaqResult: IterPhyOp #FieldCols=2 #ValueCols=0
15 Add: LookupPhyOp LogOp=Add LookupCols(140)('orders_migrations'[migration_id]) Double
16 ColValue<'orders_migrations'[migration_id]>: LookupPhyOp LogOp=ColValue<'orders_migrations'[migration_id]>'orders_migrations'[migration_id] LookupCols(140)('orders_migrations'[migration_id]) Double
17 Constant: LookupPhyOp LogOp=Constant Integer 0
Логический план запроса из DAX Studio
Скрытый текст
Код
Line Logical Query Plan
1 CalculateTable: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[B], ''[A], ''[])
2 CalculateTable: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[B], ''[A], ''[])
3 SelectColumns: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[B], ''[A], ''[])
4 LeftOuterJoin: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], ''[B])
5 CalculateTable: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4, 5)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61])
6 SelectColumns: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4, 5)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61])
7 Scan_Vertipaq: RelLogOp DependOnCols()() 3-140 RequiredCols(19, 95, 140)('Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], 'Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id])
8 Add: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
9 'orders_migrations'[migration_id]: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
10 Constant: ScaLogOp DependOnCols()() Integer DominantValue=0
11 'Наряды'[Слой разовой услуги]: ScaLogOp DependOnCols(95)('Наряды'[Слой разовой услуги]) String DominantValue=NONE
12 CalculateTable: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4)(''[migration_id], ''[B])
13 SelectColumns: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4)(''[migration_id], ''[B])
14 Scan_Vertipaq: RelLogOp DependOnCols()() 3-140 RequiredCols(95, 140)('Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id])
15 Add: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
16 'orders_migrations'[migration_id]: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
17 Constant: ScaLogOp DependOnCols()() Integer DominantValue=0
18 'Наряды'[Слой разовой услуги]: ScaLogOp DependOnCols(95)('Наряды'[Слой разовой услуги]) String DominantValue=NONE
19 ''[migration_id]: ScaLogOp DependOnCols(3)(''[migration_id]) Double DominantValue=NONE
20 ''[B]: ScaLogOp DependOnCols(6)(''[B]) String DominantValue=NONE
21 ''[A]: ScaLogOp DependOnCols(4)(''[A]) String DominantValue=NONE
22 Filter_Vertipaq: RelLogOp DependOnCols()() 0-0 RequiredCols(0)('Отчетный период'[Год])
23 Scan_Vertipaq: RelLogOp DependOnCols()() 0-0 RequiredCols(0)('Отчетный период'[Год])
24 'Отчетный период'[Год] = 2019: ScaLogOp DependOnCols(0)('Отчетный период'[Год]) Boolean DominantValue=FALSE
25 Filter_Vertipaq: RelLogOp DependOnCols()() 1-1 RequiredCols(1)('Отчетный период'[Номер квартала])
26 Scan_Vertipaq: RelLogOp DependOnCols()() 1-1 RequiredCols(1)('Отчетный период'[Номер квартала])
27 'Отчетный период'[Номер квартала] = 1: ScaLogOp DependOnCols(1)('Отчетный период'[Номер квартала]) Boolean DominantValue=FALSE
28 Filter_Vertipaq: RelLogOp DependOnCols()() 2-2 RequiredCols(2)('Продукт'[Подгруппа продуктов])
29 Scan_Vertipaq: RelLogOp DependOnCols()() 2-2 RequiredCols(2)('Продукт'[Подгруппа продуктов])
30 'Продукт'[Подгруппа продуктов] = Продукт1: ScaLogOp DependOnCols(2)('Продукт'[Подгруппа продуктов]) Boolean DominantValue=FALSE
А вот без SELECTCOLUMNS: Код Line Logical Query Plan
1 CalculateTable: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], ''[B])
2 CalculateTable: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], ''[B])
3 LeftOuterJoin: RelLogOp DependOnCols()() 3-6 RequiredCols(3, 4, 5, 6)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], ''[B])
4 CalculateTable: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4, 5)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61])
5 SelectColumns: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4, 5)(''[migration_id], ''[A], 'Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61])
6 Scan_Vertipaq: RelLogOp DependOnCols()() 3-140 RequiredCols(19, 95, 140)('Услуги'[RowNumber-2662979B-1795-4F74-8F37-6A1BA8059B61], 'Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id])
7 Add: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
8 'orders_migrations'[migration_id]: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
9 Constant: ScaLogOp DependOnCols()() Integer DominantValue=0
10 'Наряды'[Слой разовой услуги]: ScaLogOp DependOnCols(95)('Наряды'[Слой разовой услуги]) String DominantValue=NONE
11 CalculateTable: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4)(''[migration_id], ''[B])
12 SelectColumns: RelLogOp DependOnCols()() 3-5 RequiredCols(3, 4)(''[migration_id], ''[B])
13 Scan_Vertipaq: RelLogOp DependOnCols()() 3-140 RequiredCols(95, 140)('Наряды'[Слой разовой услуги], 'orders_migrations'[migration_id])
14 Add: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
15 'orders_migrations'[migration_id]: ScaLogOp DependOnCols(140)('orders_migrations'[migration_id]) Double DominantValue=NONE
16 Constant: ScaLogOp DependOnCols()() Integer DominantValue=0
17 'Наряды'[Слой разовой услуги]: ScaLogOp DependOnCols(95)('Наряды'[Слой разовой услуги]) String DominantValue=NONE
18 Filter_Vertipaq: RelLogOp DependOnCols()() 0-0 RequiredCols(0)('Отчетный период'[Год])
19 Scan_Vertipaq: RelLogOp DependOnCols()() 0-0 RequiredCols(0)('Отчетный период'[Год])
20 'Отчетный период'[Год] = 2019: ScaLogOp DependOnCols(0)('Отчетный период'[Год]) Boolean DominantValue=FALSE
21 Filter_Vertipaq: RelLogOp DependOnCols()() 1-1 RequiredCols(1)('Отчетный период'[Номер квартала])
22 Scan_Vertipaq: RelLogOp DependOnCols()() 1-1 RequiredCols(1)('Отчетный период'[Номер квартала])
23 'Отчетный период'[Номер квартала] = 1: ScaLogOp DependOnCols(1)('Отчетный период'[Номер квартала]) Boolean DominantValue=FALSE
24 Filter_Vertipaq: RelLogOp DependOnCols()() 2-2 RequiredCols(2)('Продукт'[Подгруппа продуктов])
25 Scan_Vertipaq: RelLogOp DependOnCols()() 2-2 RequiredCols(2)('Продукт'[Подгруппа продуктов])
26 'Продукт'[Подгруппа продуктов] = Продукт1: ScaLogOp DependOnCols(2)('Продукт'[Подгруппа продуктов]) Boolean DominantValue=FALS
Выглядит вывод вот так:
Скрытый текст
migration_id A B 2774 ПЕРЕКЛЮЧЕНИЕ ПЕРЕКЛЮЧЕНИЕ 7403 ПЕРЕКЛЮЧЕНИЕ ПЕРЕКЛЮЧЕНИЕ
А без SELECTCOLUMNS выглядит вот так:
Скрытый текст
migration_id B A 2774 ПЕРЕКЛЮЧЕНИЕ 7403 ПЕРЕКЛЮЧЕНИЕ
У кого-нибудь есть идеи как это вылечить?)
Изменено: vetrintsev - 28.06.2019 02:11:16