webForumDet fria alternativet

Hitta samma fast olika

Databaser & SQLur Databashanterare & SQL

6 svar · 257 visningar · startad av MMats

MMatsMedlem sedan sep. 200061 inlägg
Frågan#1

Hej !

Jag försöker att ta reda på var olika produkter finns i ett lager.
Det finns flera produkter av samma sort som är lagrade på olika ställen.
Nu försöker jag sålla ut vilka produkter som det finns fler än en av och sen
vill jag hitta var dessa finns (För att sedan kunna sortera dem).

Tabellen ser ut enligt följande:

tblProducts
===========
fldProductID
fldProductName
fldLocation1
fldLocation2

Om jag kör en "SELECT fldProductName FROM tblProducts GROUP BY fldProductName HAVING Count(fldProductName) > 1"
får jag reda på vilka det finns fler än en av. Men hur ska jag sen göra för att visa de
(sorterade på produktnamn) som finns utspridda (Dvs där fldLocation1, fldLocation2 är olika)?

Tack på förhand

MMats

snake_vbgMedlem sedan aug. 200226 inlägg
#2

Tjena du får köra med joins du får joina olika tabeller typ

SELECT product.tabel1, product.table2 FROM tabel1 INNER JOIN tabel2 ON product.table1 = product.table2 group BY product HAVING count(product.table1, product.table2 ) > 1

typ något sådant får du köra, kolla i trådarna efter joins etc.

LarsGMedlem sedan dec. 200012 464 inlägg
#3
select * from products where fldLocation1 <> fldLocation2

eller så får du ge ett exempel på innehållet i tabellen eftersom din fråga kan tolkas på lite olika sätt.

Din datamodell är något suspekt med repeterande fält.

MMatsMedlem sedan sep. 200061 inlägg
#4

okej jag är tydligen lite oklar med vad jag menar.

Jag har en massa produkter som ligger i lådor som är utspridda på flera ställen
(inte utspridda där av mig.. men sådant är läget så det är bara att göra det bästa av situationen).
Lådorna är numrerade och representerar fldLocation2 och platserna där lådorna ligger är fldLocation1.

Vad jag vill göra är att samla ihop produkter av samma sort på samma ställe så att det blir lätt att
plocka ut dem och att det blir lättare att få en bra översikt.

Jag försöker nu göra en sql-fråga som sorterar ut de produkter som är utspridda och presenterar det så
att någon kan gå ut och rent fysiskt sortera produkterna. Det finns även några extra fält som jag skulle
vilja fanns med på presentationen som innehåller extra information till den som ska sortera.

Om man stolpar upp vad jag vill göra så är det följande:

  • Hitta de produkter som är fler än 1
  • Visa var dessa produkter finns och hur många de är på samma position samt lite extra information.

Tabellen ser ut ungefär såhär med andra ord.

tblProducts
===========
fldProductID
fldProductName
fldLocation1
fldLocation2
fldExtraInformation

===

Jo LarsG min datamodell kan tyckas lite suspekt då jag har både produktID och produktNamn i samma tabell.
Men då det inte är särskilt vanligt med att det finns mer än 1-3 produkter med samma namn tyckte jag det var
onödigt att normalisera detta. Dessutom läggs det till och tas bort produkter hela tiden.

Är jag lite klarare nu i mitt resonemang?

Tack på förhand

MMats

agneta_rungMedlem sedan juli 2002145 inlägg
#5

Om du gör så här får du träff på alla produktnamn som inte ligger på samma location1... Är det det du vill, tro? :q

select fldproductname, fldproductlocation1, fldproductlocation2
from tblproducts p
where exists 
  (select * from tblproducts
   where p.fldproductname = fldproductname
   and p.fldproductlocation1 <> fldproductlocation1)
MMatsMedlem sedan sep. 200061 inlägg
#6

Tack agneta_rung det var nästan det jag ville ha.
Din SQL-fråga gav mig alla produkter som var utspridda på flera ställen. Fick läsa på lite vad EXISTS gör (har inte använt det förut)
och passade även på att kolla upp vad IN gör.
Problemet är att det även gav mig dubletter på produkter som låg på samma ställe om det även fanns någon som låg på ett annat ställe.
T ex om man har sammma produkt på tre olika ställen: position3, position5 och position3 så fick man samtliga. Det är ju rätt logiskt.
Vad jag då gjorde var att lägga till DISTINCT i min query

SELECT DISTINCT P.fldProductName, P.fldLocation4, P.fldBatch FROM tblProducts AS P 
WHERE EXISTS 
(SELECT fldProductName FROM tblProducts AS P2 WHERE P.fldProductName = P2.fldProductName AND P.fldLocation4 <> P2.fldLocation4) 
ORDER BY P.fldProductName ASC

Men nu har jag ett annat problem. Jag vill ju även visa lite mer information om produkterna.
Men om jag kör DISTINCT på fler fält får jag även med produkter som ligger på samma ställe.

Någon som har ett förslag på hur man löser detta?

MMats

agneta_rungMedlem sedan juli 2002145 inlägg
#7

Hej igen MMats!

Tja, du kan ju alltid lägga till en nivå till... Men då håller jag verkligen med LarsG om att det börjar lukta märklig datamodellering! Vart hör den "extra informationen" - i själva verkligheten alltså? Hör den till produkten eller till lagerplatsen? Om den hör till produkten borde det inte vara något problem med din distinct, men hör den till lagerplatsen eller kanske till kombinationen produkt/lagerplats så borde du nog fundera på att modellera om databasen...

Denna fråga ger träff på samma produkt på samma lagerplats om "den extra informationen" skiljer sig.

select fldproductname, fldLocation4, fldBatch
from tblproducts as p2
where exists
  (select * from tblproducts as p
  where p2.fldproductname = fldproductname 
  and fldLocation4 = p2.fldLocation4
  and exists 
    (select * from tblproducts
     where p.fldproductname = fldproductname
     and p.fldLocation4 <> fldLocation4))
order by fldproductname, fldLocation4

Garanterar inte att detta funkar. Har inte testat fullt ut!! :P

147 ms totalt · 3 externa anrop · v20260731065814-full.58439ac5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)