IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Atbl')
DROP TABLE Atbl
CREATE TABLE ATbl
(
Id int unique,
AName varchar(20),
)
GO
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Btbl')
DROP TABLE Btbl
CREATE TABLE BTbl
(
Id int unique,
BName varchar(20),
ATblId int
)
GO
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='Ctbl')
DROP TABLE Ctbl
CREATE TABLE CTbl
(
Id int unique,
CName varchar(20),
BTblId int
)
GO
TRUNCATE TABLE Atbl
TRUNCATE TABLE Btbl
TRUNCATE TABLE Ctbl
INSERT INTO Atbl VALUES (1, 'Name1')
INSERT INTO Atbl VALUES (2, 'Name2')
INSERT INTO Atbl VALUES (3, 'Name3')
INSERT INTO Btbl VALUES (1, 'Name1', 2)
INSERT INTO Btbl VALUES (2, 'Name2', 3)
INSERT INTO Ctbl VALUES (1, 'Name2', 2)
select * from atbl
left join btbl on btbl.atblid=atbl.id
inner join ctbl on ctbl.btblid=btbl.id
select * from atbl
left join
(select btbl.id, btbl.atblid from btbl
inner join ctbl on ctbl.btblid=btbl.id) a
on atbl.id=a.atblid
Почему левое соединение превращается во внутреннее соединение, если внутреннее соединение включено в запрос?
Почему один внутреннее соединение в запросе превращает все запросы в внутреннее соединение. Первый запрос соединяется с TblA - (LEFT JOIN) -> TblB -> (INNER JOIN) -> TblC = Весь запрос соединен внутри.
Единственное решение, которое я нашел, это присоединение к подзапросу в левом соединении, однако я не понимаю, как оно отличается.
ОК. если первое соединение произошло первым, оно все равно должно показать все результаты от TblA. И вообще, что лучше включить весь запрос в левые соединения или сделать подзапрос, как второй? – schizofreindly
Нет, как только левое соединение происходит, результат берется как одна новая таблица. Эта таблица выполняется внутренним соединением с третьей таблицей. Таким образом, итоговыми значениями будут те, которые соответствуют результирующим значениям вашего левого соединения и третьей таблицы. –