Как вступить вместо союза - PullRequest
0 голосов
/ 24 октября 2019

У меня есть запрос с объединением между двумя таблицами, который работает, как и ожидалось, но теперь я хотел бы переопределить, чтобы присоединиться, потому что у меня есть таблица с полем, которое может объединяться между этими двумя таблицами. Теперь, когда я пишу оператор соединения, я был удивлен, что он получил таблицу с максимальным значением и применил вторую таблицу

. Давайте посмотрим на код:

declare  @Users table (UserId int, UserName nvarchar(50))
insert into @Users(UserId,UserName) values 
(1,'Test users 1'),
(2,'Blah user')

declare  @Computers table (ComputerId int, UserId int, ComputerName nvarchar(50))
insert into @Computers (ComputerId, UserId,ComputerName)
values (3, 1, 'Test comp 3'),
(5, 2, 'blah 1'),
(6, 2, 'blah 1')

declare  @ComputersDeleted table (ComputerId int, UserId int, ComputerName nvarchar(50))
insert into @ComputersDeleted (ComputerId, UserId,ComputerName)
values (1, 1, 'Test comp 1'),
(2, 1, 'Test comp 2'),
(4, 2, 'blah')

-- excpected result
select * from @Computers where UserId = 1
union
select * from @ComputersDeleted where UserId = 1

select * from @Users u
left join @Computers c on c.UserId = u.UserId
left join @ComputersDeleted cd on cd.UserId = u.UserId
where u.UserId = 1

как написатьвступать в союз в этом случае? Я хотел бы получить такие данные

table 1, table 2 , table 3
data1    NULL      data3
data1    NULL      data3
data1    data2     NULL

вместо того, чтобы работать сейчас, как применить

table 1, table 2 , table 3
data1    data2      data3
data1    data2      data3

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

С CTE

declare  @Users table (UserId int, UserName nvarchar(50))
insert into @Users(UserId,UserName) values 
(1,'Test users 1'),
(2,'Blah user')

declare  @Computers table (ComputerId int, UserId int, ComputerName nvarchar(50))
insert into @Computers (ComputerId, UserId,ComputerName)
values (3, 1, 'Test comp 3'),
(5, 2, 'blah 1'),
(6, 2, 'blah 1')

declare  @ComputersDeleted table (ComputerId int, UserId int, ComputerName nvarchar(50))
insert into @ComputersDeleted (ComputerId, UserId,ComputerName)
values (1, 1, 'Test comp 1'),
(2, 1, 'Test comp 2'),
(4, 2, 'blah')


--WITH CTE
;WITH table_union(ComputerId, UserId,ComputerName)
AS
(
select ComputerId, UserId,ComputerName   from @Computers
union ALL
select  ComputerId, UserId,ComputerName from @ComputersDeleted
)
select *
from @Users u
LEFT Outer join table_union ON table_union.UserId = u.UserId
where u.UserId = 1

Вы также можете создать представление, объединяющее таблицы

0 голосов
/ 24 октября 2019

Используйте что-то вроде:

select 
 UserId as Table1,
C.ComputersID as Table 2,
 null as Table3
 from @Users u
left join @Computers c on c.UserId = u.UserId
union
select 
 UserId as Table1,
 null as Table2,
cd.ComputersID as Table3
 from @Users u
left join @ComputersDeleted cd on cd.UserId = u.UserId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...