---
title: "få ut unika ur produkt-tabell"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/185234-få-ut-unika-ur-produkt-tabell"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "rhdf"
published: "2010-11-12T21:24:21.000Z"
updated: "2010-11-13T19:15:04.000Z"
replies: 13
views: 812
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/185234-få-ut-unika-ur-produkt-tabell"
---

# få ut unika ur produkt-tabell

## #1 — rhdf, 2010-11-12T21:24Z

Gokväll
Jag sitter med ett lite delikat problem.

i en uselt byggd databas så har jag en tabell där alla produkter ligger. Problemet är att många av dem är endast varianter på varandra, tex olika storlekar.

nu tänkte jag mig då att lite snyggt flytta ut den gemensamma infon till en egen tabell och sen länka ihop alltsammans igen.

tabellen har bland annat fälten 
VendorID
Title
ProduktTypID

Genom dessa borde man kunna identifiera produkter som hör samman med varandra. Frågan är hur en vettig SQL-sats för det skall se ut.

Dvs nuvarande data kan se ut såhär

```
VendorID		Title 		ProdTypeID	Storlek 
1		yadayadda	        1		L
1		yadayadda	        1		M
1		yadayadda	        1		S
1		hoppsan		1		One-size
```

och jag vill få ut

```
VendorID		Title 		ProdTypeID	
1		yadayadda	        1		
1		hoppsan		1
```

Min tanke är nån variant med "group by" och sen köra en Insert-Select för att skapa tabellen med "huvudprodukter" och sen göra nån omvänd procedur för att hitta huvudprodukternas underprodukter

nuvarande tabellen med produkter får inte förändras, dvs inte skapas om, eftersom all gammal orderhistorik, säljstatistik mm är innehåller referenser till dess primärnyckel

Så, visa vad ni går för och kom med smarta tips  :birp

Permalänk: https://www.webforum.nu/p/185234

## #2 — Gildebrand, 2010-11-12T21:34Z

```
Select first(VendorID), first(title), first(ProdTypeID) from tabell group by Title
```

Permalänk: https://www.webforum.nu/p/2259414

## #3 — rhdf, 2010-11-13T04:20Z

nopp first verkade inte funka alls,...

Permalänk: https://www.webforum.nu/p/2259415

## #4 — Gildebrand, 2010-11-13T09:51Z

Vad kör du för databas? Tror bara att "first" funkar för MySql

Permalänk: https://www.webforum.nu/p/2259420

## #5 — adde2, 2010-11-13T10:11Z

fel.

Permalänk: https://www.webforum.nu/p/2259422

## #6 — SPiN, 2010-11-13T11:12Z

Det du vill göra kan bli svårt att göra enbart med SQL. Men om vi gör ett försök:

Det första du vill göra är att plocka ut alla storlekar till en egen tabell:

```
create table `sizes` (
`id` int unsigned not null auto_increment,
`size` varchar(25) not null,
primary key(`id`)
);

insert into
`sizes` (size)
select
distinct(`Storlek`)
from
`your_product_table`
```

Sen vill du hämta alla produkter och lägga i en ny tabell.

```
insert into
`your_new_table` (ProductID, VendorID, Title, ProdTypeID)
select
`ProductID`,
`VendorId`,
`Title`,
`ProdTypeID`
from
`your_old_table`
group by
`ProductID`
```

Sen börjar problemen. Nu vill du skapa en tabell som hanterar relationen mellan produkten och storleken.

```
create table `product_sizes` (
`productId` int unsigned not null,
`sizeId` int unsigned not null,
primary key(`productId`, `sizeId`)
);
```

Nu ska alltså alla produkt-id:n och storleks-id:n in i den tabellen. Ett försök (from the top of my head):

```
insert into
`product_sizes` (productId, sizeId)
select
a.`ProductID` as productId,
b.`id` as sizeId
from
`your_old_table` as old,
`your_new_table` as a,
`sizes` as b
where
b.`size`=old.`Storlek`
and
a.`ProductID`=old.`ProductID`
```

Inte testat, men något liknande skulle jag gissa på att du behöver.

Permalänk: https://www.webforum.nu/p/2259428

## #7 — Peeer, 2010-11-13T12:45Z

Är det bara för mig som SPiNs svar ser lite trunkerat ut? Adde2s kommentar tyder på att han ser/såg en annan version av inlägget.

Bilagor:

- [trunkerat.png](https://www.webforum.nu/a/22201.png)

Permalänk: https://www.webforum.nu/p/2259431

## #8 — adde2, 2010-11-13T12:49Z

> **[Peeer skrev:](https://www.webforum.nu/p/1522664)**
>
> Är det bara för mig som SPiNs svar ser lite trunkerat ut? Adde2s kommentar tyder på att han ser/såg en annan version av inlägget.

Nä det ser trukerat ut för mig med, Spins svar var dock med i mailet som kom när han svarade på tråden.
Han svar såg ut så här:

> Det du vill göra kan bli svårt att göra enbart med SQL. Men om vi gör ett försök:
> 
> Det första du vill göra är att plocka ut alla storlekar till en egen tabell:
> 
> Code:
> \---------
> create table \`sizes\` (
>    \`id\` int unsigned not null auto_increment,
>    \`size\` varchar(25) not null,
>    primary key(\`id\`)
> );
> 
> insert into
>    \`sizes\` (size)
> select
>    distinct(\`Storlek\`)
> from
>    \`your_product_table\`
> \---------
> Sen vill du hämta alla produkter och lägga i en ny tabell.
> 
> 
> Code:
> \---------
> insert into
>    \`your_new_table\` (ProductID, VendorID, Title, ProdTypeID)
> select
>    \`ProductID\`,
>    \`VendorId\`,
>    \`Title\`,
>    \`ProdTypeID\`
> from
>    \`your_old_table\`
> group by
>    \`Title\`
> \---------
> Sen börjar problemen. Nu vill du skapa en tabell som hanterar relationen mellan produkten och storleken.
> 
> Code:
> \---------
> create table \`product_sizes\` (
>    \`productId\` int unsigned not null,
>    \`sizeId\` int unsigned not null,
>    primary key(\`productId\`, \`sizeId\`)
> );
> \---------
> Nu ska alltså alla produkt-id:n och storleks-id:n in i den tabellen. Ett försök (from the top of my head):
> 
> Code:
> \---------
> insert into
>    \`product_sizes\` (productId, sizeId)
> select
>    a.\`ProductID\` as productId,
>    b.\`id\` as sizeId
> from
>    \`your_old_table\` as old,
>    \`your_new_table\` as a,
>    \`sizes\` as b
> where
>    b.\`size\`=old.\`Storlek\`
>    and
>    a.\`ProductID\`=old.\`ProductID\`
> \---------
> Inte testat, men något liknande skulle jag gissa på att du behöver.
> \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

Permalänk: https://www.webforum.nu/p/2259432

## #9 — SPiN, 2010-11-13T15:53Z

Det var spännande :)

Jag gjorde en editering av något (minns inte vad just nu), som tog väääldigt lång tid på sig att slutföra requesten. Men efter det gått igenom så såg allt rätt ut. Märkligt!

Har återskapat inlägget.

Permalänk: https://www.webforum.nu/p/2259439

## #10 — rhdf, 2010-11-13T17:57Z

Spins lösning är ju ungefär det jag vill åstadkomma.
Grundproblemet återstår dock. dvs hur får jag ut "unika" produkter
det funkar inte att enbart gruppera på titel, eftersom samma "tillverkare" kan ha flera produkter med samma titel, fast olika produkttyp
tex 
VendorID Title Prodtype (egentligen ID)
1  SomeTitle Tshirt
1  SomeTitle Longsleeve
1  SomeTitle CD

kan "Group By VendorID,Title, ProdTypeID" funka?

jag kommer inte behöva skapa någon "kopplingstabell" mellan produkt och storlek, eftersom den tabellen redan finns, dvs den nuvarande produkt-tabellen (som måste finnas kvar eftersom jag inte har lust att ändra produktID:n i varenda order sen 2007

Permalänk: https://www.webforum.nu/p/2259445

## #11 — SPiN, 2010-11-13T18:02Z

Nu minns jag att det var min ändring! Jag ändrade grupperingen till ProductID, för det fältet fanns väl?

Men för att svara på frågan, ja - du kan gruppera på fler fält än ett (1).

Permalänk: https://www.webforum.nu/p/2259446

## #12 — adde2, 2010-11-13T18:26Z

> **[SPiN skrev:](https://www.webforum.nu/p/1522681)**
>
> Nu minns jag att det var min ändring! Jag ändrade grupperingen till ProductID, för det fältet fanns väl?
> 
> Men för att svara på frågan, ja - du kan gruppera på fler fält än ett (1).

fast eftersom att du inte använder någon aggregatfunktion så kanske det snyggare att använda distinct istället.

Permalänk: https://www.webforum.nu/p/2259449

## #13 — rhdf, 2010-11-13T18:31Z

ProductID finns, det är primärnyckeln i nuvarande tabellen ;)
Så den har man ingen större nytta av att gruppera på ;)

Permalänk: https://www.webforum.nu/p/2259450

## #14 — adde2, 2010-11-13T19:15Z

Funkar i SQLServer 2008.

```
create table gamla_tabellen
(
	vendorid int,
	title varchar(25),
	prodtypeid int,
	storlek varchar(25)
);

insert into gamla_tabellen values (1, 'yadayadda', 1, 'L');
insert into gamla_tabellen values (1, 'yadayadda', 1, 'M');
insert into gamla_tabellen values (1, 'yadayadda', 1, 'S');
insert into gamla_tabellen values (1, 'hoppsan', 1, 'One-size');

create table nya_tabellen
(
	prodid int identity,
	vendorid int,
	title varchar(25),
	prodtypeid int
);

create table storlek
(
	storleksid int identity,
	storlek varchar(25)
);

create table linktabell
(
	prodid int,
	storleksid int
);

insert  into nya_tabellen (vendorid , title, prodtypeid)
select distinct vendorid , title, prodtypeid
from gamla_tabellen;

insert into storlek (storlek)
select distinct storlek from gamla_tabellen;

insert into linktabell (prodid, storleksid)
select distinct n.prodid, s.storleksid
from nya_tabellen n
inner join gamla_tabellen g on n.vendorid = g.vendorid and n.prodtypeid = g.prodtypeid and n.title = g.title
inner join storlek s on g.storlek = s.storlek;

select * from nya_tabellen n
inner join linktabell l on n.prodid = l.prodid
inner join storlek s on l.storleksid = s.storleksid
```

sen ska du givetvis lägga till primärnycklar, index och foreign keys... etc...

Permalänk: https://www.webforum.nu/p/2259451

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/185234-få-ut-unika-ur-produkt-tabell
