powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
24 сообщений из 24, страница 1 из 1
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928305
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день
Вопрос почемучка :)
Хотелось бы, если возможно, получить комментарии более опытных товарищей на возникшее поведение при связке 3- х таблиц.

Исходные данные
Версия сервера Microsoft SQL Server 2014 - 12.0.4213.0 (X64)
Jun 9 2015 12:06:16
Copyright (c) Microsoft Corporation
Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Но тестовая база приведена в тоже состояние что и боевая SQL Server 2008(100)

(таблицы выдуманные на основе реальных)
Код: 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.
Create Table t_Main /*~ 900 000 строк*/
(
MainID int primary key,
OrderNum nvarchar(100)
)

Create Table t_Sub1 /*~ 800 000 строк*/
(
Sub1_id int not null primary key,
MainID int, /*ссылка на t_Main (MainID)*/
LinkID int
)
Create Index IX_MainID_LinkID ON t_Sub1(MainID) Include(LinkID)

Create Table t_Sub2 /*~ 2000 строк*/
(
Sub2_id int not null primary key,
DelayID int /*ссылка на t_Main (MainID)*/
)
Create Index IX_DelayID ON t_Sub2(DelayID)

/*Собственно сам запрос*/


declare @ID int  = 976567 /*Произвольный ID*/
Select t_Main.* from t_Main	
		LEFT JOIN t_Sub1 ON t_Main.MainID =t_Sub1.MainID
		LEFT JOIN t_Sub2 ON t_Main.MainID =t_Sub2.DelayID
		Where t_MAin.MainID= @ID



План выполнения запроса
В приложенном изображении
Вопросы: При связи t_Main и t_Sub2 появляется предупреждение Warning no join Predicate
На форумах пишут что движок SQL Server может самостоятельно убирать предикат на этапе упрощения запроса. И если посмотреть на
оператор поиска по индексу IX_DelayID то видно что output list пусть - оператор ничего не возвращает, и наверное да, предиката не будет, но:

1) почему он появляется? (формальную причину я понял -сканирование индекса t_Sub2 не возвращает никаких значений)
2)Вытекает из 1 -ого почему если запрос написать:
Код: sql
1.
2.
3.
4.
5.
declare @ID int  = 976567 /*Произвольный ID*/
Select t_Main.* from t_Main	
		LEFT JOIN t_Sub1 ON t_Main.MainID =t_Sub1.MainID
		LEFT JOIN t_Sub2 ON t_Main.MainID =t_Sub2.DelayID
		Where t_MAin.MainID= @ID


То получаем warning
А если написать
Код: sql
1.
2.
3.
4.
Select t_Main.* from t_Main	
		LEFT JOIN t_Sub1 ON t_Main.MainID =t_Sub1.MainID
		LEFT JOIN t_Sub2 ON t_Main.MainID =t_Sub2.DelayID
		Where t_MAin.MainID= 976567

ТО warning-a нет.
И в первом и во втором случае оператор поиска по индексу не возвращает полей, но только в первом я получаю warning а во втором нет.почему?
3) почему он исчезает при связи только 2- х таблиц t_Main и t_Sub2
3а)почему он исчезает при указании 2-х значений (доподлинно известно что и второе значение в таблице отсутствует. Более того Output List также пуст).
4)Показывает ли что то данная ситуация? Имеется ввиду это звоночек будущих проблем? Или не заморачиваться?

Заранее спасибо
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928306
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнительно прикладываю Property sheet оператора Index Seek
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928383
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,

NL с No Join Predicate означает декартово произведение.

Ваш запрос по сути эквивалентен
Код: sql
1.
2.
3.
4.
Select t_Main.* from t_Main	
		outer apply (select 1 from t_Sub1 where t_Sub1.MainID = @ID) a
		outer apply (select 1 from t_Sub2 where t_Sub2.DelayID = @ID) b
		Where t_MAin.MainID= @ID;


Т.е. два декартовых произведения.

В первом на внешнем входе NL всегда будет одна или ноль строк. Поэтому предупреждения нет.
Во втором на внешнем входе NL может быть больше одной строки. Поэтому предупреждение есть.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928392
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Я правильно понимаю, сервер предполагает, что после первого Nested loops может прийти дубль на вход второго?
А оценка количества строк с внешнего и внутреннего входов не учитывается? Ведь и там и там он по одной строке получает.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928397
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

А как быть с переменной в Where и просто числом. Почему он так разнится поведение?

Еще вопрос, какую книжку почитать чтобы так эквиваленты запросов расписывать?
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928402
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,

на 2017 не получил "плохой" план. Хотя и данными не заполнял.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928413
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Да, я тоже перевел базу в режим совместимости выше 100 (2014) и warning также пропал.


Видимо это поведение 2008 -ого сервера. Но все остальное (output list) пустой и на 2014
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928419
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей
Я правильно понимаю, сервер предполагает, что после первого Nested loops может прийти дубль на вход второго?
Да.
Алексей
А оценка количества строк с внешнего и внутреннего входов не учитывается? Ведь и там и там он по одной строке получает.
Поясните.
Алексей
А как быть с переменной в Where и просто числом. Почему он так разнится поведение?
Не знаю. Вы же план с константой не показали. Только не картинкой показывайте.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928420
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Сначала план
Код: xml
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.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="12.0.4213.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="1.00009" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="70" StatementSubTreeCost="0.00985768" StatementText="Select t_Main.* from t_Main	&#xD;&#xA;		LEFT JOIN t_Sub1 ON t_Main.MainID =t_Sub1.MainID&#xD;&#xA;		LEFT JOIN t_Sub2 ON t_Main.MainID =t_Sub2.DelayID&#xD;&#xA;		Where t_MAin.MainID =976567" StatementType="SELECT" QueryHash="0xEE0EF895EA89AC92" QueryPlanHash="0x95C8431355236F79" RetrievedFromCache="true">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan DegreeOfParallelism="1" CachedPlanSize="24" CompileTime="3" CompileCPU="3" CompileMemory="256">
            <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
            <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="208256" EstimatedPagesCached="104128" EstimatedAvailableDegreeOfParallelism="4" />
            <RelOp AvgRowSize="115" EstimateCPU="4.18039E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1.00009" LogicalOp="Left Outer Join" NodeId="0" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00985768">
              <OutputList>
                <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="MainID" />
                <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="OrderNum" />
              </OutputList>
              <RunTimeInformation>
                <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
              </RunTimeInformation>
              <NestedLoops Optimized="false">
                <RelOp AvgRowSize="115" EstimateCPU="4.18039E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1.00009" LogicalOp="Left Outer Join" NodeId="1" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="0.00657038">
                  <OutputList>
                    <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="MainID" />
                    <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="OrderNum" />
                  </OutputList>
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                  </RunTimeInformation>
                  <NestedLoops Optimized="false">
                    <RelOp AvgRowSize="115" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Clustered Index Seek" NodeId="2" Parallel="false" PhysicalOp="Clustered Index Seek" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="882510">
                      <OutputList>
                        <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="MainID" />
                        <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="OrderNum" />
                      </OutputList>
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                      </RunTimeInformation>
                      <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                        <DefinedValues>
                          <DefinedValue>
                            <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="MainID" />
                          </DefinedValue>
                          <DefinedValue>
                            <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="OrderNum" />
                          </DefinedValue>
                        </DefinedValues>
                        <Object Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Index="[PK__t_Main__71F8F5AC2150E41D]" IndexKind="Clustered" Storage="RowStore" />
                        <SeekPredicates>
                          <SeekPredicateNew>
                            <SeekKeys>
                              <Prefix ScanType="EQ">
                                <RangeColumns>
                                  <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Main]" Column="MainID" />
                                </RangeColumns>
                                <RangeExpressions>
                                  <ScalarOperator ScalarString="(976567)">
                                    <Const ConstValue="(976567)" />
                                  </ScalarOperator>
                                </RangeExpressions>
                              </Prefix>
                            </SeekKeys>
                          </SeekPredicateNew>
                        </SeekPredicates>
                      </IndexScan>
                    </RelOp>
                    <RelOp AvgRowSize="9" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1.00009" LogicalOp="Index Seek" NodeId="3" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="872401">
                      <OutputList />
                      <RunTimeInformation>
                        <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" />
                      </RunTimeInformation>
                      <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                        <DefinedValues />
                        <Object Database="[Indx]" Schema="[dbo]" Table="[t_Sub1]" Index="[IX_MainID_LinkID]" IndexKind="NonClustered" Storage="RowStore" />
                        <SeekPredicates>
                          <SeekPredicateNew>
                            <SeekKeys>
                              <Prefix ScanType="EQ">
                                <RangeColumns>
                                  <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Sub1]" Column="MainID" />
                                </RangeColumns>
                                <RangeExpressions>
                                  <ScalarOperator ScalarString="(976567)">
                                    <Const ConstValue="(976567)" />
                                  </ScalarOperator>
                                </RangeExpressions>
                              </Prefix>
                            </SeekKeys>
                          </SeekPredicateNew>
                        </SeekPredicates>
                      </IndexScan>
                    </RelOp>
                  </NestedLoops>
                </RelOp>
                <RelOp AvgRowSize="9" EstimateCPU="0.0001581" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="9.36985E-05" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Index Seek" NodeId="4" Parallel="false" PhysicalOp="Index Seek" EstimatedTotalSubtreeCost="0.00328311" TableCardinality="1448">
                  <OutputList />
                  <RunTimeInformation>
                    <RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="1" ActualExecutions="1" />
                  </RunTimeInformation>
                  <IndexScan Ordered="true" ScanDirection="FORWARD" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
                    <DefinedValues />
                    <Object Database="[Indx]" Schema="[dbo]" Table="[t_Sub2]" Index="[IX_DelayID]" IndexKind="NonClustered" Storage="RowStore" />
                    <SeekPredicates>
                      <SeekPredicateNew>
                        <SeekKeys>
                          <Prefix ScanType="EQ">
                            <RangeColumns>
                              <ColumnReference Database="[Indx]" Schema="[dbo]" Table="[t_Sub2]" Column="DelayID" />
                            </RangeColumns>
                            <RangeExpressions>
                              <ScalarOperator ScalarString="(976567)">
                                <Const ConstValue="(976567)" />
                              </ScalarOperator>
                            </RangeExpressions>
                          </Prefix>
                        </SeekKeys>
                      </SeekPredicateNew>
                    </SeekPredicates>
                  </IndexScan>
                </RelOp>
              </NestedLoops>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>

...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928424
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,


invm
Алексей
А оценка количества строк с внешнего и внутреннего входов не учитывается? Ведь и там и там он по одной строке получает.
Поясните.


Я имел ввиду следующее
первый оператор Clustered Index Seek Возвращает 1 строку (поиск по полю кластерного индекса), и соответственно поля [Indx].[dbo].[t_Main].MainID; [Indx].[dbo].[t_Main].OrderNum для внешнего цикла NL
Второй оператор Index Seek (по некластерному индексу) не возвращает ничего( и не должен по идее: я с него полей не прошу и соединении или условии фильтра он не используется)
Т.е. движок не учитывает, того что в данном случае это будет одна строка.
Или я все очень упрощенно понимаю......
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928438
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда удвоение строк, есть джойн по первичному ключу в левых таблицах?
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928445
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,

Разные оценки количества строк на входе второго NL для константы и переменной. Да и порядок соединения таблиц разный.
Алексей
Т.е. движок не учитывает, того что в данном случае это будет одна строка.
О каком случае речь?
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928448
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Откуда удвоение строк, есть джойн по первичному ключу в левых таблицах?
t_Sub1.MainID и t_Sub2.DelayID уникальны?
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928458
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
t_Sub1.MainID и t_Sub2.DelayID уникальны?


Нет, не уникальны.

invm
О каком случае речь?

Первый NL
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928464
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей
Нет, не уникальны.
Я в курсе :) Вопрос был Владиславу Колосову.
Алексей
Первый NL
Тогда не понято, что, по-вашему, не учитывает движок?

В общем, наличие предупреждения зависит от оценочного числа строк на внешнем входе NL, формирующего декартово произведение.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
if object_id('tempdb..#t', 'U') is not null
 drop table #t;

create table #t (id int);
go

update statistics #t with rowcount = 1;
set statistics xml on;
select t.id from #t t cross join master.dbo.spt_values;
set statistics xml off;
go

update statistics #t with rowcount = 2;
set statistics xml on;
select t.id from #t t cross join master.dbo.spt_values;
set statistics xml off;
go
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928468
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Да и порядок соединения таблиц разный.

Вроде как нет
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928469
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928470
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Это я понял. Спасибо.

Как я понимаю в данном конкретном случае это (warning) не критично.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928486
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей
Вроде как нет
Да, одинаковый.
Но оценки разные.
Алексей
Как я понимаю в данном конкретном случае это (warning) не критично.
Да.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928547
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Ваш запрос по сути эквивалентен
Код: sql
1.
2.
3.
4.
Select t_Main.* from t_Main	
		outer apply (select 1 from t_Sub1 where t_Sub1.MainID = @ID) a
		outer apply (select 1 from t_Sub2 where t_Sub2.DelayID = @ID) b
		Where t_MAin.MainID= @ID;



Т.е. два декартовых произведения.

В первом на внешнем входе NL всегда будет одна или ноль строк. Поэтому предупреждения нет.
Во втором на внешнем входе NL может быть больше одной строки. Поэтому предупреждение есть.
А почему в первом "всегда будет одна или ноль строк"? Там же тоже может быть больше одной строки.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928548
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
А почему в первом "всегда будет одна или ноль строк"? Там же тоже может быть больше одной строки.
Каким образом, если t_MAin.MainID первичный ключ?
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928578
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg
А почему в первом "всегда будет одна или ноль строк"? Там же тоже может быть больше одной строки.
Каким образом, если t_MAin.MainID первичный ключ?
В
Код: sql
1.
	outer apply (select 1 from t_Sub1 where t_Sub1.MainID = @ID) a

t_Sub1.MainID не первичный ключ.

То есть произведение t_MAin и t_Sub1, для конкретного t_MAin.MainID = @ID и t_Sub1.MainID = @ID будет давать от 0 до много записей.

И произведение t_MAin и t_Sub2, для конкретного t_MAin.MainID = @ID и t_Sub2.DelayID = @ID будет давать от 0 до много записей.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928593
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Речь идет о внешнем входе первого NL, а не о его результате.
...
Рейтинг: 0 / 0
Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
    #39928604
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
alexeyvg,

Речь идет о внешнем входе первого NL, а не о его результате.
А, о входе... Понял.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос почемучка (LEFT JOIN 3-х таблиц) Warning No Predicate
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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