У вас есть вопрос относительно того, что было выбором в запросе, который я изменяю во вставку в запрос с помощью select, и я просто хотел, чтобы кто-то помог мне понять запрос и узнать, почему единственные поля в select it хочет только определенные поля.Понимание вложенных запросов на выбор
Хорошо, поэтому ниже приводится инструкция создания таблицы, которую я написал для временных таблиц '#Infants'
и '#MobileBookings'
.
create table #MobileBookings
(
Reference nvarchar(50),
CreatedDate datetime,
FirstName nvarchar(50),
Surname nvarchar(50),
PersonTypeId int,
PackageId int,
PersonId int,
ProductId int,
StatusId smallint
)
create table #Infants
(
Reference nvarchar(50),
CreatedDate datetime,
FirstName nvarchar(50),
Surname nvarchar(50),
PersonTypeId int,
ProductPersonId int,
StatusId smallint,
FlightNumber nvarchar(50),
DepartureDateTime datetime,
SectorName nvarchar(50),
BoundID varchar(8)
)
Теперь то, что у меня есть в существующем коде (что я не писал, но пытается манипулировать включая вставку в вместо того, что ранее было выбрать в удалить определенные предупреждения.
insert into #Infants (
Reference, CreatedDate, FirstName, Surname,
PersonTypeId, ProductPersonId, StatusId, FlightNumber,
DepartureDateTime, SectorName, BoundID
)
select * from
(
select
x.Reference, x.CreatedDate, x.FirstName, x.Surname,
x.PersonTypeId, pp.ProductPersonId, pp.StatusId as 'ProductPersonStatusID', null as 'DependantPPID',
fl.FlightNumber,
fl.DepartureDateTime, fs.SectorName, iif(fr.BoundID=0,'OutBound','InBound') as 'FlightBound'
from #MobileBookings as x
inner join Reservations_Live.dbo.ProductPerson as pp with (nolock) on pp.ProductID = x.ProductId and pp.PersonId = x.PersonId
inner join Reservations_Live.dbo.FlightReservation as fr with (nolock) on fr.ProductId = x.ProductId
inner join Reservations_Live.dbo.Flight as fl with (nolock) on fl.FlightId = fr.FlightId
inner join Reservations_Live.dbo.FlightSector as fs with (nolock) on fs.FlightSectorId = fl.FlightSectorId
INNER join
(
select x.PackageId as 'PKID', frp.DependantProductPersonId as 'DepPPID', frp.ProductPersonID as 'CarerPPID',
pp.StatusId as 'CarerPPST'
from #MobileBookings as x
inner join Reservations_Live.dbo.ProductPerson as pp with (nolock) on pp.ProductID = x.ProductId and pp.PersonId = x.PersonId
inner join Reservations_Live.dbo.FlightReservationPassenger as frp with (nolock) on frp.ProductPersonID = pp.ProductPersonId
where x.PersonTypeId = 1
and pp.StatusId = 3
and frp.DependantProductPersonId is not null
)
as car on car.PKID = x.PackageId and car.DepPPID = pp.ProductPersonId
where x.StatusId < 7
and x.PersonTypeId = 3
and pp.StatusId = 2
and fl.FlightStatusId < 3
and fl.DepartureDateTime > GETUTCDATE()
) as inf;
set @ActualRowCount = @@rowcount;
Ok поэтому в Visual Studio, если навести курсор на *
в операторе выбора, он отображает окно парения, который показывает только поля для этого необходимо выбрать:
Reference (nvarchar, null),
CreatedDate (datetime, null),
FirstName (nvarchar, null),
Surname (nvarchar, null),
PersonTypeId (int, null),
ProductPersonStatusID(, null),
DependantPPID(void, not null),
FlightBound (, null)
Я предполагаю, что мне нужно изменить мою таблицу создания и вставить ее, чтобы включать только эти соответствующие поля выше, но то, что я хочу знать, - это то, почему они хотят только выбрать эти поля и не включать какие-либо другие соответствующие поля?
Также в отношении ProductPersonStatusID and DependantPPID
, который основан на «StatusID», они фактически отображаются как два столбца в конечном результате, то есть таблица create должна включать оба этих столбца, и оба они также должны быть включены вставить в? StatusId является int, поэтому, если это так, я предполагаю, что 'ProductPersonStatusID' должен быть установлен как int, но DependantPPID
должен быть установлен как null в инструкции CREATE?
UPDATE:
Надеюсь, я в правой части, но включены подзапрос для инф, как указано в комментарии:
update pp
set pp.StatusId = 3
output 'ProductPerson', 'ProductPersonId', inserted.ProductPersonId,
Core.updXMLFragment('StatusId',inserted.StatusId,deleted.StatusId)
into @OutputList
from Reservations_Live.dbo.ProductPerson as pp
inner join #Infants as inf on inf.ProductPersonId = pp.ProductPersonId;
set @UpdateRowCount = @@Rowcount;
Просто чтобы убедиться, что я изменил таблицу создания и вставка в заявлении для наблюдения, которые я надеюсь, правильно:
create table #Infants
(
Reference nvarchar(50),
CreatedDate datetime,
FirstName nvarchar(50),
Surname nvarchar(50),
PersonTypeId int,
ProductPersonStatusID int,
DependantPPID int,
FlightBound varchar(8)
);
--
insert into #Infants (Reference, CreatedDate, FirstName, Surname, PersonTypeId, ProductPersonStatusID, DependantPPID, FlightBound)
select * from...
Какие столбцы доступны из подзапроса идентифицированного как * * инф? Вы видите, куда я направляюсь? –
@PieterGeerkens Надеюсь, я в правильном разделе, я думаю, что я включил подзапрос в обновление, для которого я предполагаю, что он вызывает это обновление? – BruceyBandit
Никогда не используйте INSERT/SELECT без явного указания всех столбцов. Я не знаю, что делает визуальная студия. Возможно, это предполагает, что вы замените звезду этими полями. На самом деле вам вообще не нужен внешний 'SELECT *'.(и его сопровождающий ') как inf' в конце) –