SQL - Rensa upp en databas

Tråden skapades och har fått 4 svar. Det senaste inlägget skrevs .
1

Kanske inte är rätt forum eg. men jag testar

Sitter med en SQL-databas där jag har två tabeller. En Order-tabell och en Produkorder-tabell. En simpel förklaring är att dem är uppbyggnad på följande sätt där själv ordern ligger i en tabell och produkterna i en annan. Varje produkt har ett en kolumn med det ID vars order produkten tillhör:

tblOrder
-------------
orderID
orderNamn
orderLevererad
....

tblProduktorder
-----------------------
orderID
produktNamn

Nu till mitt lilla problem. Jag skulle vilja gå igenom databasen och och tar bort alla ordrar som har levererats samt alla produkter som tillhör dessa orderar. Detta tänkte jag sedan schemalägga så det utförs 1 gång i månaden. Någon som kan hjälpa en vilsen stjäl.

Tänkte om man kunde göra detta med nån form av stored procedure som lopar igenom och tar bort alla levererade ordrar samtidigt som den triggar en bortagning av produkterna.

  • Oregistrerad
  • 2007-02-01 14:36

Du har alltså inte produkterna i produktordertabellen utan kopierar bara in namnet under produktNamn ? (ingen Key alltså)?

Vet inte vad du kör för SQL, men du kan ju i MySQL göra en:
Select * from tblorder HAVING orderID = (SELECT * from tblProduktorder where tblProduktorder.orderID = tblOrder.orderID)

typ. en Subselect alltså. Den kör du som en stored procedure om du vill, eller ett script bara.

Ursprungligen av studiox:

Du har alltså inte produkterna i produktordertabellen utan kopierar bara in namnet under produktNamn ? (ingen Key alltså)?

Vet inte vad du kör för SQL, men du kan ju i MySQL göra en:
Select * from tblorder HAVING orderID = (SELECT * from tblProduktorder where tblProduktorder.orderID = tblOrder.orderID)

typ. en Subselect alltså. Den kör du som en stored procedure om du vill, eller ett script bara.

Jag har en SQL 2005 Express (:'( ) å jag styr databasen som jag vill.

Jag har:
En tabell med ordern
En tabell med produkter
En tabell där jag lägger in orderprodukterna som har en kolumn med orderID och en med produktID

Så man kan säga att dem hör i hop på fölande sätt väldigt förenklat

tblOrder
--------
orderID (K)
....

tblProduktorder
--------------
produktOrderID (K)
orderID
produktID
.......

tblProdukter
-----------
produktID (K)
....

Kan göra en mer avancerad beskrivning av databasen im när jag har den framför mig och kan göra en bild.

Skapa relationer har ingen aning om hur man gör faktiskt Gjorde det på Access-tiden genom att dra relationslinjer

Hoppas ni fått lite mer att gå på

  • Medlem
  • Kiruna
  • 2007-02-01 15:13

Det 'riktiga' sättet att göra detta är att sätta upp ordentliga relationer mellan tabellerna och sedan utnyttja cascaded delete, då behöver du bara ta bort de orderrader du önskar, så försvinner även de relaterade produkterna. Om du inte har möjlighet att ändra databasschemat så behöver du ändå inte använda nån stored procedure med en loop, följande räcker:

BEGIN;
DELETE FROM tblProduktorder WHERE orderID IN (SELECT orderID FROM tblOrder WHERE orderLevererad);
DELETE FROM tblOrder WHERE orderLevererad;
COMMIT;

(Detta förutsätter att kolumnen 'orderLevererad' är, eller kan konverteras till BOOL.)

Ursprungligen av spot:

Det 'riktiga' sättet att göra detta är att sätta upp ordentliga relationer mellan tabellerna och sedan utnyttja cascaded delete, då behöver du bara ta bort de orderrader du önskar, så försvinner även de relaterade produkterna. Om du inte har möjlighet att ändra databasschemat så behöver du ändå inte använda nån stored procedure med en loop, följande räcker:

BEGIN;
DELETE FROM tblProduktorder WHERE orderID IN (SELECT orderID FROM tblOrder WHERE orderLevererad);
DELETE FROM tblOrder WHERE orderLevererad;
COMMIT;

(Detta förutsätter att kolumnen 'orderLevererad' är, eller kan konverteras till BOOL.)

Tackar så mycket för att ni har hjälpt mig, lyckades skriva en korrekt SQL-sats som jag sedan schemlade. orderLevererad var inte i ett BOOL-värde utan ett datum, men jag löste det genom att kolla om den kolumnen hade ett datum äldre eller lika med 30 dagar.

Senast redigerat 2007-02-02 10:44
1
Bevaka tråden