Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Non-Normalised Table and Joins
Message
From
24/11/2016 09:29:42
 
General information
Forum:
Microsoft SQL Server
Category:
SQL syntax
Environment versions
SQL Server:
SQL Server 2012
Miscellaneous
Thread ID:
01643905
Message ID:
01643907
Views:
29
>>Hi,
>>
>>I am working on airline reservation/ticketing data and have no control over the underlying database, I can only run queries on it.
>>
>>I have 3 Tables:
>>
>>
>>/****** Object:  Table [dbo].[PNR]    Script Date: 24/11/2016 09:09:28 AM ******/
>>
>>CREATE TABLE [dbo].[PNR](
>>	[PnrId] [bigint] IDENTITY(1,1) NOT NULL,
>>	[RecordLocator] [varchar](6) NULL,
>>	[OfficeID] [varchar](50) NULL,
>>	[OfficeIATA] [varchar](50) NULL,
>>	[AgencyName] [varchar](50) NULL,
>>	[Sign] [varchar](50) NULL,
>>	[Observation] [varchar](255) NULL,
>>	[DateCreated] [datetime] NULL,
>>	[DateUpdated] [datetime] NULL,
>>	[AppOrgId] [int] NOT NULL,
>>	[PnrVersionId] [int] NOT NULL,
>>	[LowestFare] [varchar](255) NULL,
>>	[HighestFare] [varchar](255) NULL,
>>	[TripNumber] [varchar](255) NULL,
>>	[SAPNumber] [varchar](255) NULL,
>>	[Policy] [varchar](255) NULL,
>>	[ReasonCode] [varchar](255) NULL,
>>	[AirJustificationCode] [varchar](255) NULL,
>>	[AirJustificationText] [varchar](255) NULL,
>>	[AppliedDiscountCode] [varchar](255) NULL,
>>	[IsInPolicy] [varchar](255) NULL,
>>	[FreeText1] [varchar](255) NULL,
>>	[FreeText2] [varchar](255) NULL,
>>	[FreeText3] [varchar](255) NULL,
>>	[FreeText4] [varchar](255) NULL,
>>	[FreeText5] [varchar](255) NULL,
>>	[SiteCode] [varchar](10) NULL,
>>	[WebFareTotal] [varchar](255) NULL,
>> CONSTRAINT [PK_Report] PRIMARY KEY CLUSTERED 
>>(
>>	[PnrId] ASC
>>)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
>>) ON [PRIMARY]
>>
>>GO
>>
>>SET ANSI_PADDING OFF
>>GO
>>
>>ALTER TABLE [dbo].[PNR] ADD  CONSTRAINT [LM_REPORT]  DEFAULT (getdate()) FOR [DateCreated]
>>GO
>>
>>ALTER TABLE [dbo].[PNR] ADD  CONSTRAINT [DF_PNR_DateCreated1]  DEFAULT (getdate()) FOR [DateUpdated]
>>GO
>>
>>ALTER TABLE [dbo].[PNR]  WITH CHECK ADD  CONSTRAINT [FK_PNR_PnrVersion] FOREIGN KEY([PnrVersionId])
>>REFERENCES [dbo].[PnrVersion] ([PnrVersionId])
>>GO
>>
>>ALTER TABLE [dbo].[PNR] CHECK CONSTRAINT [FK_PNR_PnrVersion]
>>GO
>>
>>/****** Object:  Table [dbo].[TST]    Script Date: 24/11/2016 09:11:25 AM ******/
>>
>>CREATE TABLE [dbo].[TST](
>>	[Id] [bigint] IDENTITY(1,1) NOT NULL,
>>	[BaseFareAmount] [float] NULL,
>>	[TotalFareAmount] [float] NULL,
>>	[TaxAmount] [float] NULL,
>>	[CurrencyBaseFare] [varchar](3) NULL,
>>	[PnrId] [bigint] NULL,
>>	[FareBasis] [varchar](250) NULL,
>>	[CurrencyTotalFare] [varchar](3) NULL,
>>	[SegmentRPH] [varchar](100) NULL,
>>	[EquivalentAmount] [float] NULL,
>>	[EquivalentCurrency] [varchar](3) NULL,
>>	[SEGMENTTATTOONUMBERS] [varchar](50) NULL,
>>	[PAXTATTOONUMBERS] [varchar](50) NULL,
>> CONSTRAINT [PK_TST] PRIMARY KEY CLUSTERED 
>>(
>>	[Id] ASC
>>)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
>>) ON [PRIMARY]
>>
>>GO
>>
>>SET ANSI_PADDING OFF
>>GO
>>
>>ALTER TABLE [dbo].[TST]  WITH CHECK ADD  CONSTRAINT [FK_TST_PNR] FOREIGN KEY([PnrId])
>>REFERENCES [dbo].[PNR] ([PnrId])
>>ON UPDATE CASCADE
>>ON DELETE CASCADE
>>GO
>>
>>ALTER TABLE [dbo].[TST] CHECK CONSTRAINT [FK_TST_PNR]
>>GO
>>
>>
>>/****** Object:  Table [dbo].[Ticket]    Script Date: 24/11/2016 09:10:42 AM ******/
>>
>>CREATE TABLE [dbo].[Ticket](
>>	[Id] [bigint] IDENTITY(1,1) NOT NULL,
>>	[TicketNumber] [varchar](50) NULL,
>>	[PnrId] [bigint] NULL,
>>	[TicketDate] [date] NULL,
>>	[AirlineTktCode] [varchar](50) NULL,
>>	[TicketType] [varchar](3) NULL,
>>	[IssuerCode] [varchar](15) NULL,
>>	[FreeTex] [varchar](250) NULL,
>>	[AssociatedSegmentTattooNumbers] [varchar](50) NULL,
>>	[ASSOCIATEDPAXTATTOONUMBERS] [varchar](50) NULL,
>> CONSTRAINT [PK_Ticket] PRIMARY KEY CLUSTERED 
>>(
>>	[Id] ASC
>>)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
>>) ON [PRIMARY]
>>
>>GO
>>
>>SET ANSI_PADDING OFF
>>GO
>>
>>ALTER TABLE [dbo].[Ticket]  WITH CHECK ADD  CONSTRAINT [FK_Ticket_PNR] FOREIGN KEY([PnrId])
>>REFERENCES [dbo].[PNR] ([PnrId])
>>ON UPDATE CASCADE
>>ON DELETE CASCADE
>>GO
>>
>>ALTER TABLE [dbo].[Ticket] CHECK CONSTRAINT [FK_Ticket_PNR]
>>GO
>>
>>
>>The relationships between the tables are:
>>
>>A PNR is related to the TST and Ticket tables through:
>>
>>PNR.PNRId = TST.PNRId
>>
>>PNR.PNRId = Ticket.PNRId
>>
>>
>>The TST table is related to the Ticket table through:
>>
>>Ticket.pnrid = tst.pnrid
>>and Ticket.associatedsegmenttattoonumbers = tst.segmenttattoonumbers
>>and Ticket.associatedpaxtattoonumbers = tst.paxtattoonumbers
>>
>>The problem with the latter relationships is that the values in the TST.PaxTattooNumbers might be "1,2,3" while in the Ticket.AssociatedPaxTattooNumbers we might have 3 records , one with each of those values of 1, 2 and 3. Like this
>>
>>
>>TST Table:
>>
>>TSTId   PNRId   PaxTattooNumbers
>>1       1       1,2,3
>>
>>Ticket Table:
>>
>>TicketId   PnrId    AssociatedPaxTattooNumbers
>>1          1        1
>>2          1        2
>>3          1        3
>>
>>
>>The PaxtattooNumbers represent passengers and a passenger can be a child which will share a ticket with a regular passenger so it is also possible to have ticket records like this:
>>
>>
>>TicketId   PnrId    AssociatedPaxTattooNumbers
>>1          1        1,2
>>2          1        3
>>
>>
>>In this case 2 represents a child, so only 2 tickets were issued.
>>
>>My challenge is that I need to find all the PNR.PNRIds that have not been fully ticketed. That is each TST has a corresponding record in the ticket table for all passengers.
>>
>>This was my initial query when I didn't realise the PaxTattooNumbers got split up on the Ticket table:
>>
>>
select pnrid
>>      ,[SEGMENTTATTOONUMBERS]
>>      ,[PAXTATTOONUMBERS]
>>from tst
>>where not exists (select pnrid
>>						,associatedsegmenttattoonumbers
>>						,associatedpaxtattoonumbers
>>					from ticket
>>					where pnrid = tst.pnrid 
>>						and associatedsegmenttattoonumbers = segmenttattoonumbers
>>						and associatedpaxtattoonumbers = paxtattoonumbers)
>>	order by pnrid
>>
>>How would I adjust this to handle the splitting up of the PaxTattooNumbers?
>
>If you use SQL Server 2016 :-) there is biult-in function STRING_SPLIT.
>For smaller version google TSQL SPLIT :-)

I am on SQL 2012 so can't use the suggested built in function. From what I am seeing, I need to write (or copy one that was written already) a tsql function which will split it up.

I'm not seeing how I would then apply that to my problem, can you help fill in the blank for me?

Say I have a function:
CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1
       
        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)
        
    END 
    RETURN 
END
How would I adjust my query to get this to work?
Frank.

Frank Cazabon
Samaan Systems Ltd.
www.samaansystems.com
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform