2015-12-21 5 views
1

У вас есть вопрос относительно того, что было выбором в запросе, который я изменяю во вставку в запрос с помощью 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... 
+1

Какие столбцы доступны из подзапроса идентифицированного как * * инф? Вы видите, куда я направляюсь? –

+0

@PieterGeerkens Надеюсь, я в правильном разделе, я думаю, что я включил подзапрос в обновление, для которого я предполагаю, что он вызывает это обновление? – BruceyBandit

+0

Никогда не используйте INSERT/SELECT без явного указания всех столбцов. Я не знаю, что делает визуальная студия. Возможно, это предполагает, что вы замените звезду этими полями. На самом деле вам вообще не нужен внешний 'SELECT *'.(и его сопровождающий ') как inf' в конце) –

ответ

1

Я предлагаю вам удалить select * в целом. Это плохая практика. Существует редко веская причина для использования SELECT * Как это было, у вас было несколько полей, несовпадающих.

Обратите внимание, что порядок полей в INSERT должен соответствовать порядку полей в SELECT. Вот почему мне нравится распространять их по нескольким строкам, чтобы я мог их сопоставить.

Также WITH (NOLOCK) не магия идти быстрое переключение, но это для другой должности ....

insert into #Infants (
Reference, CreatedDate, 
FirstName, Surname, 
PersonTypeId, ProductPersonId, 
StatusId, FlightNumber, 
DepartureDateTime, SectorName, 
BoundID 
) 
select 
x.Reference, x.CreatedDate, 
x.FirstName, x.Surname, 
x.PersonTypeId, pp.ProductPersonId, 
pp.StatusId as [ProductPersonStatusID], 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() 
Смежные вопросы