Ik heb even assistentie nodig met een bepaalde query.
Ik heb twee tabellen 'orders' en 'ordertrack'. Per order record bestaan er meerdere ordertrack records.
Een order heeft (vanzelfsprekend) een ID en de bijbehorende ordertracks zijn hieraan gekoppeld met dit ID.
De ordertracks hebben een kolom 'status' om de diverse statussen die een order doorloopt te kunnen volgen.
even de create scripts. Kolommen die niet aan de orde zijn, zijn weg gelaten.
Een order kan diverse statussen hebben. Van 1 (nieuwe order) t/m 20 (afgehandeld). Daarnaast zijn er enkele ordertrack orderstatus codes (bijvoorbeeld het getal 100 = order geprint) die we bijhouden om te monitoren wat de gebruiker met de order gedaan heeft.
Nu wil ik van een bepaalde receiver alle orders (na een bepaalde bezorgdatum) terug krijgen die niet geprint zijn. Dus alle orders waarbij er in de orderstatus tabel geen regel voorkomt met orderstatus 100.
Daar had ik de volgende query voor bedacht.
Echter heb ik het idee dat dit veel effectiever kan. Iemand ideeën?
Ik heb twee tabellen 'orders' en 'ordertrack'. Per order record bestaan er meerdere ordertrack records.
Een order heeft (vanzelfsprekend) een ID en de bijbehorende ordertracks zijn hieraan gekoppeld met dit ID.
De ordertracks hebben een kolom 'status' om de diverse statussen die een order doorloopt te kunnen volgen.
even de create scripts. Kolommen die niet aan de orde zijn, zijn weg gelaten.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| CREATE TABLE [dbo].[OrderHead]( [ID] [int] IDENTITY(1,1) NOT NULL, [Sender] [int] NOT NULL, [Receiver] [int] NOT NULL, [OrderID] [int] NOT NULL, [DeliveryDate] [numeric](8, 0) NOT NULL CONSTRAINT [PK_OrderHead] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] ) ON [PRIMARY] CREATE TABLE [dbo].[OrderTrack]( [ID] [int] IDENTITY(1,1) NOT NULL, [OrderId] [int] NOT NULL, [OrderStatus] [int] NOT NULL, [DateChanged] [datetime] NOT NULL, [ChangedBy] [varchar](25) NOT NULL, [IPAddress] [varchar](15) NOT NULL, [Sender] [int] NOT NULL, [Receiver] [int] NOT NULL CONSTRAINT [PK_OrderTrack] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] ) ON [PRIMARY] |
Een order kan diverse statussen hebben. Van 1 (nieuwe order) t/m 20 (afgehandeld). Daarnaast zijn er enkele ordertrack orderstatus codes (bijvoorbeeld het getal 100 = order geprint) die we bijhouden om te monitoren wat de gebruiker met de order gedaan heeft.
Nu wil ik van een bepaalde receiver alle orders (na een bepaalde bezorgdatum) terug krijgen die niet geprint zijn. Dus alle orders waarbij er in de orderstatus tabel geen regel voorkomt met orderstatus 100.
Daar had ik de volgende query voor bedacht.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| DECLARE @receiver INT = 340, @deliverydate INT = 20121201, @status INT = 100 SELECT oh.id AS [ID], oh.orderid AS [Ordernummer], oh.sender AS [Afzender], oh.receiver AS [Ontvanger], oh.deliverydate AS [Bezorgdatum] FROM orderhead oh WHERE oh.receiver = @receiver AND oh.deliverydate > @deliverydate AND id NOT IN ( SELECT DISTINCT oh.id FROM orderhead oh INNER JOIN ordertrack ot ON oh.ID = ot.OrderId WHERE oh.receiver = @receiver AND oh.deliverydate > @deliverydate AND ot.OrderStatus = @status ) ORDER BY oh.OrderId |
Echter heb ik het idee dat dit veel effectiever kan. Iemand ideeën?