Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Matcha och sen sätta in.

Postades av 2006-04-04 19:58:40 - Niklas Jansson, i forum databaser, Tråden har 8 Kommentarer och lästs av 955 personer

Håller på och skriver en applikation som använder SQLite.

Jag har tre tabeller enligt:

A:
ID
text

B:
ID
text

C:
AID
BID
count

I sql enforcas inte FOREIGN KEYS.

Jag kommer få kaskader av info. Det är en A.text, och en lista med B.text och count.
Till C lägger jag sen ett antal rader, alla med detta enda motsvarande AID, och övriga med Bid och count för varje i listan.

Typ:
A: apa
B | count
banan | 4
citron | 5

=> (apa har AID 1, banan BID 1 och citron BID 3) =>

A|B|count
1|1|4
1|3|5

Jag funderar nu helt enkelt om det finns något bättre sätt att lösa det på än att loopa igenom hela listan och ta fram BID för varje B.text. Observera att jag får det på "programmatisk form", det är alltså inget som finns i någon tabell redan innan.

Ideer?


Svara

Sv: Matcha och sen sätta in.

Postades av 2006-04-05 10:15:01 - Ola Lindfeldt

Jag förstår inte vad du vill göra. Du får inga svar eftrsom du ställer så otydliga frågor.

Varför ska du lagra count() / dvs antal?

Det är inget bra, du kan ta fram det med select count()





Svara

Sv:Matcha och sen sätta in.

Postades av 2006-04-05 12:25:25 - Niklas Jansson

Det är inte en count på det sättet, du kan se det som ett värde C.

Skit samma.
Jag har en lista med par; (x, y). x är en sträng, y är ett heltal (I en std::map<std::string, int> i C++ i mitt fall)
I en tabell (1) har jag x och ett id för varje sådant x. ("a", 1; "b", 2; ...)
I en annan tabell (2) har jag kopplingar till id:et i tabell 1. En kolumn med det id:et och en kolumn för "y" ovan.

Jag kan få in ("a", 7), vilket jag då vill omvandla till (1, 7) och infoga i tabell 2.

Det är pissenkelt. Det jag funderade på var om det finns bättre sätt att göra det på än att kolla varje enskilt x-värde i min input-lista, för att på så sätt få fram mitt x-id. Och eftersom det finns temporära tabeller är problemet löst.


Svara

Sv: Matcha och sen sätta in.

Postades av 2006-04-05 16:56:37 - Ola Lindfeldt

INSERT INTO t2(idX, idY)
SELECT 7, t1.id from t1 where t1.x = 'a'
(t1.x ska vara unikt)


Svara

Sv:Matcha och sen sätta in.

Postades av 2006-04-05 21:22:32 - Niklas Jansson

Jo, jo, det var det jag menade med "pissenkelt". Jag funderade på om det fanns andra sätt, 1k såna listor med 10k såna poster vill jag helst få iväg så fort det går.

Jag gissar att det går fortare att lägga in skiten i en temporär tabell, göra en join och lägga in allt i t2.


Svara

Sv: Matcha och sen sätta in.

Postades av 2006-04-07 10:51:43 - Göran Roseen

Styr du över tabellstrukturen själv?

I så fall skulle jag tycka att eftersom varje B har ett count och varje count bara hör till ett B, så skall de ligga i samma tabell. Det kunde se ut som:

A:
==
ID
A-text

B:
==
A-ID
B-text
Count


Om du nu inte vill ändra där, så skulle jag göra något i stil med:

Köra query "INSERT INTO A (Text) VALUES (@Text); SELECT @@IDENTITY", med parametern @Text.
Spara det returnerade ID-värdet som A-id.

För varje B:
Köra queryn "INSERT INTO B (Text) VALUES (@Text); SELECT @@IDENTITY", spara det returnerade B-ID:t.
Köra queryn "INSERT INTO C (AID, BID, Count) VALUES (@Aid, @Bid, @Count)"

HELST skulle jag ha kombinerat ihop de två senare till en SP, och bara haft ett anrop till SP:n. Men det är inte alltid kul att använda stored procedures.

/Göran


Svara

Sv:Matcha och sen sätta in.

Postades av 2006-04-07 18:56:09 - Niklas Jansson

<b>>I så fall skulle jag tycka att eftersom varje B har ett count och varje count bara hör till ett B, så skall de ligga i samma tabell. Det kunde se ut som[...]</b>

Jo, så kan man göra, och jag har också övervägt det. Problemet är att det kommer göras "kombinationssökningar" på "b-text". Alltså; man söker på ett antal b samtidigt och kombinerar resultaten. Eftersom det är strängar, och eftersom det kan vara hyfsat stora datavolymer och hyfsat många samtidiga användare känns det bättre att bara söka på strängar en gång för varje fråga sen.

<b>>
För varje B:
Köra queryn "INSERT INTO B (Text) VALUES (@Text); SELECT @@IDENTITY", spara det returnerade B-ID:t.
Köra queryn "INSERT INTO C (AID, BID, Count) VALUES (@Aid, @Bid, @Count)"
</b>
Men varje B kommer förekomma flera gånger per varje A. Jag kan inte sätta in nya varje gång.


Svara

Sv: Matcha och sen sätta in.

Postades av 2006-04-11 10:47:38 - Göran Roseen

OK, så för varje B slår du först upp det i B-tabellen, och om det finns sätter du bara in B-ID:t i C-tabellen.

Om det inte finns sätter du in det i B-tabellen, noterar ID:t och sätter in detta i C-tabellen.

För visst sa du att du inte själv behöver hantera count-datat? Eller kommer du, då det finns flera av samma B på en A, vilja summera deras count-värden också?


Svara

Sv:Matcha och sen sätta in.

Postades av 2006-04-11 11:35:34 - Niklas Jansson

<b>>OK, så för varje B slår du först upp det i B-tabellen, och om det finns sätter du bara in B-ID:t i C-tabellen.

Om det inte finns sätter du in det i B-tabellen, noterar ID:t och sätter in detta i C-tabellen.</b>
Precis.
Eller enklare; först kollar jag om B finns, finns det inte lägger jag in det. Sen slår jag upp det och lägger in det i tabellen.

Det jag funderade på var om det fanns effektivare sätt att lösa det på; det blir väldigt många databasanrop. Och lösningen är nu något i stil med:

CREATE TEMP TABLE t1(btext, c);
INSERT INTO t1(?, ?);
--mata på med hela min std::map in i t1.
INSERT INTO B
SELECT btext FROM B WHERE NOT btext IN (SELECT bID FROM B);
INSERT INTO C
SELECT bID, c FROM (t1 NATURAL JOIN B)

Skrivet på frihand, koden kan skilja sig lite. Jag misstänker att det är snabbare att göra så här; det blir ungefär hälften eller en tredjedel så många anrop till databasen, men precis samma logik.


Svara

Nyligen

  • 17:54 Vegastars New Zealand
  • 16:56 Verde Casino Danmark
  • 13:54 Vegastars: Top Australian Online C
  • 21:28 Chicken Road Casino Game
  • 21:21 1xBet Promo Code 2025
  • 18:37 Remove the bumper in AUDI
  • 15:35 Chicken road crash game
  • 21:41 Automotive Services UK

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 966
27 965
271 783
748
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies