Этот пример настолько близок, насколько я могу продемонстрировать для проблемы, которую я пытаюсь решить. В этом случае суб-выбор имеет несколько в основном дублированных строк, с той лишь разницей, что некоторые имеют delvieryDate, а некоторые - НЕ. Если имеется строка данных с датой, я хочу это. Если нет, мне нужно получить строку без даты. Я попытался исправить суб-выбор с помощью «Top 1» и «Order by dDate des c», но T- SQL не разрешит Order by в суб-выборе.
Для этого примера Я хочу строку 9 вместо строки 8, так как у предыдущего есть дата. Я также хочу строку 10, поскольку нет эквивалента с датой.
Код:
Create Table #Customer (
CustomerId int,
cName nvarchar(100),
Address nvarchar(100),
)
INSERT INTO #Customer
VALUES (1, 'Bill', '123 1st St'),
(2, 'Fred', '111 Market St'),
(3, 'Lisa', '01 Boulevard')
Create Table #MealType (
MealTypeId int,
mName nvarchar(100)
)
INSERT INTO #MealType
VALUES (1, '1 - Breakfast'), (2, '2 - Lunch'), (3, '3 - Dinner')
Create Table #Food (
FoodId int,
fName nvarchar(100),
Restaurant nvarchar(100),
MealType_fk int
)
INSERT INTO #Food
VALUES (3, 'Bacon & Egg Biscut', 'McDs',1),
(2, 'Happy Meal', 'McDs', 2),
(1, 'Pizza', 'Dominos', 3),
(4, 'Santa Fe Salad', 'GrubHub', 2)
Create Table #Delivery (
DeliveryId int,
FoodId_fk int,
CustomerId_fk int,
dDate datetime
)
INSERT INTO #Delivery
VALUES (1, 1, 1, CONVERT(date, getdate())),
(2, 2, 1, CONVERT(date, getdate())),
(3, 3, 1, CONVERT(date, getdate())),
(4, 1, 2, CONVERT(date, getdate())),
(5, 2, 2, CONVERT(date, getdate())),
(6, 3, 2, CONVERT(date, getdate())),
-- removed data (7, 1, 3, CONVERT(date, getdate())),
(8, 4, 3, CONVERT(date, getdate())),
(9, 3, 3, CONVERT(date, getdate())),
(10, 1, 3, NULL),
(12, 4, 3, NULL)
select
c.cName,
c.Address,
f.Restaurant,
f.fName,
m.mName,
convert(varchar, d.dDate, 103) as dDate
from #customer c
left join (select distinct
FoodId_fk,
CustomerId_fk,
dDate
from #Delivery
) as d on c.CustomerId = d.CustomerId_fk
join #Food f on d.FoodId_fk = f.FoodId
join #MealType m on f.MealType_fk = m.MealTypeId
order by cName, mName