Ce genre de chose est très difficile à faire en SQL, car SQL est conçu pour générer son jeu de résultats en comparant, au niveau le plus basique, un ensemble de valeurs de colonnes sur une seule ligne chacune à une autre valeur. Qu'est-ce que vous essayez de faire est de comparer une valeur de colonne unique (ou un ensemble de valeurs de colonnes) sur plusieurs lignes à un autre ensemble de plusieurs lignes.
Pour ce faire, vous devrez créer une sorte de signature de la commande. Strictement parlant, il n'est pas possible d'utiliser la syntaxe de requête seule; vous devrez utiliser du 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
Cela suppose (basé sur le libellé de votre question) qui commande multiple du même article dans un ordre entraînera plusieurs lignes, plutôt que d'utiliser une colonne Quantity
. Si ce dernier est le cas, il suffit de retirer la group by
de la requête de la population @Items
et remplacer Count(ItemID)
avec Quantity
.
Si la personne de commandes multiples article # 1, il serait alors dans l'ordre Détails sur plusieurs lignes, correct. Il n'y a pas de colonne "quantité"? –
Correct - aucune quantité colonne –