Такого рода вещи очень трудно сделать в SQL, поскольку SQL предназначен для генерации своего результирующего набора путем сравнения базового значения столбца в одной строке с другим значением на самом базовом уровне. Вы пытаетесь сравнить одно значение столбца (или набор значений столбца) на несколько строк с другим набором несколько строк .
Для этого вам нужно создать какую-то подпись заказа. Строго говоря, это невозможно сделать, используя только синтаксис запроса; вам придется использовать немного T-SQL.
declare @Orders table
(
idx int identity(1, 1),
OrderID int,
Signature varchar(MAX)
)
declare @Items table
(
idx int identity(1, 1),
ItemID int,
Quantity int
)
insert into @Orders (OrderID) select OrderID from [Order]
declare @i int
declare @cnt int
declare @j int
declare @cnt2 int
select @i = 0, @cnt = max(idx) from @Orders
while @i < @cnt
begin
select @i = @i + 1
declare @temp varchar(MAX)
delete @Items
insert into @Items (ItemID, Quantity)
select
ItemID,
Count(ItemID)
from OrderItem oi
join @Orders o on o.idx = @i and o.OrderID = oi.OrderID
group by oi.ItemID
order by oi.ItemID
select @j = min(idx) - 1, @cnt2 = max(idx) from @Items
while @j < @cnt2
begin
select @j = @j + 1
select @temp = isnull(@temp + ', ','') +
'(' +
convert(varchar,i.ItemID) +
',' +
convert(varchar, i.Quantity) +
')'
from @Items i where idx = @j
end
update @Orders set Signature = @temp where idx = @i
select @temp = null
end
select
o_other.OrderID
from @Orders o
join @Orders o_other on
o_other.Signature = o.Signature
and o_other.OrderID <> o.OrderID
where o.OrderID = @OrderID
Предполагается (в зависимости от формулировки вашего вопроса), что упорядочение нескольких одинаковых элементов в заказе приведет к появлению нескольких строк, а не к столбцу Quantity
. В последнем случае просто удалите group by
из запроса на заполнение @Items
и замените Count(ItemID)
на Quantity
.