Vou usar um exemplo concreto, mas hipotético.
Cada pedido normalmente tem apenas um item de linha :
Encomendas:
OrderGUID OrderNumber
========= ============
{FFB2...} STL-7442-1
{3EC6...} MPT-9931-8A
LineItems:
LineItemGUID Order ID Quantity Description
============ ======== ======== =================================
{098FBE3...} 1 7 prefabulated amulite
{1609B09...} 2 32 spurving bearing
Ocasionalmente, porém, haverá um pedido com dois itens de linha:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Normalmente, ao mostrar os pedidos ao usuário:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Quero mostrar o único item no pedido. Mas com esta ordem ocasional, contendo dois (ou mais) itens, as ordens que parecem ser duplicados :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 spurving bearing
KSG-0619-81 5 panametric fan
KSG-0619-81 5 differential girdlespring
O que eu realmente quero é que o SQL Server escolha apenas um , pois será bom o suficiente :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan
Se eu me aventurar, posso mostrar ao usuário uma elipse para indicar que há mais de um:
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan, ...
Então a questão é como
- eliminar linhas "duplicadas"
- unir-se apenas a uma das linhas, para evitar duplicação
Primeira tentativa
Minha primeira tentativa ingênua foi ingressar apenas nos itens de linha " TOP 1 ":
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN (
SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID) LineItems2
ON 1=1
Mas isso dá o erro:
A coluna ou o prefixo 'Pedidos' não
corresponde ao nome da tabela ou ao nome alternativo
usado na consulta.
Presumivelmente, porque a seleção interna não vê a tabela externa.
group by
exigiria listar todas as outras colunas, excluindo a onde você não deseja duplicatas. Fonte
group by
?