24. april 2002 - 08:53
Der er
27 kommentarer og 1 løsning
SQL query
Jeg har to tabeller: INFO og PRISER. Disse to tabeller vil jeg samle i en tabel, og har oprettet en query til dette formål. Problemet er blot at jeg ikke kan eksekvere query. Den ser således ud: mysql> CREATE TABLE VVSVARER -> (NR INT(9) NOT NULL, -> Dimension VARCHAR(22) NOT NULL, -> Overflade VARCHAR(10) NOT NULL, -> Materiale VARCHAR(10) NOT NULL, -> Fabrikat VARCHAR(15) NOT NULL, -> Mærke VARCHAR(12) NOT NULL, -> Varenavn VARCHAR(22) NOT NULL, -> Type VARCHAR(13) NOT NULL, -> Variant VARCHAR(17) NOT NULL, -> Farve VARCHAR(17) NOT NULL, -> EANnr VARCHAR(15) NOT NULL, -> Pris FLOAT(6,2), -> Enhed VARCHAR(20) NOT NULL, -> Mængde INT(3) NOT NULL) -> AS -> (SELECT -> INFO.NR, -> INFO.Dimension, -> INFO.Overflade, -> INFO.Materiale, -> INFO.Fabrikat, -> INFO.Mærke, -> INFO.Varenavn, -> INFO.Type, -> INFO.Variant, -> INFO.Farve, -> INFO.EANNRtxt, -> PRISER.COST, -> PRISER.UNIT, -> PRISER.AMOUNT -> FROM TAX.PRISER, TAX.INFO WHERE PRISER.VVSNR = INFO.VVSNR); ERROR 1064: You have an error in your SQL syntax near '(SELECT INFO.NR, INFO.Dimension, INFO.Overflade, INFO.Materiale, INFO.Fabrika' at line 17 Databasen hedder TAX mens de to tabeller ser således ud: +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | NRtxt | varchar(11) | | | | | | Dimension | varchar(22) | | | | | | Overflade | varchar(10) | | | | | | Materiale | varchar(10) | | | | | | Fabrikat | varchar(15) | | | | | | Mærke | varchar(12) | | | | | | Varenavn | varchar(22) | | | | | | Type | varchar(13) | | | | | | Variant | varchar(17) | | | | | | Farve | varchar(17) | | | | | | EANNRtxt | varchar(15) | | | | | | NR | int(9) | | | 0 | | +-----------+-------------+------+-----+---------+-------+ & +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | NRtxt | varchar(11) | | | | | | TBD1 | varchar(10) | | | | | | Desc1 | varchar(50) | | | | | | Desc2 | varchar(50) | | | | | | UNIT | varchar(20) | | | | | | AMOUNT | int(3) | | | 0 | | | COST | float(6,2) | | | 0.00 | | | TBD2 | varchar(20) | | | | | | NR | int(9) | | | 0 | | +----------+-------------+------+-----+---------+-------+
Annonceindlæg fra Arrow ECS
24. april 2002 - 09:26
#1
Prøv at droppe AS og (...) omkring din select
24. april 2002 - 09:27
#2
Du har vel set eksemplet fra dokumentationen: mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
24. april 2002 - 09:35
#3
Nu får jeg følgende fejl: mysql> CREATE TABLE VVSVARER -> ( -> VVSNR INT(9) NOT NULL, -> Dimension VARCHAR(22) NOT NULL, -> Overflade VARCHAR(10) NOT NULL, -> Materiale VARCHAR(10) NOT NULL, -> Fabrikat VARCHAR(15) NOT NULL, -> Mærke VARCHAR(12) NOT NULL, -> Varenavn VARCHAR(22) NOT NULL, -> Type VARCHAR(13) NOT NULL, -> Variant VARCHAR(17) NOT NULL, -> Farve VARCHAR(17) NOT NULL, -> EANnr VARCHAR(15) NOT NULL, -> Pris FLOAT(6,2), -> Enhed VARCHAR(20) NOT NULL, -> Mængde INT(3) NOT NULL) -> SELECT -> INFO.VVSNR, -> INFO.Dimension, -> INFO.Overflade, -> INFO.Materiale, -> INFO.Fabrikat, -> INFO.Mærke, -> INFO.Varenavn, -> INFO.Type, -> INFO.Variant, -> INFO.Farve, -> INFO.EANNRtxt, -> PRISER.COST, -> PRISER.UNIT, -> PRISER.AMOUNT -> FROM VVS.PRISER, VVS.INFO WHERE PRISER.VVSNR = INFO.VVSNR; ERROR 1060: Duplicate column name 'VVSNR'
24. april 2002 - 09:42
#4
Nå, ja, du skal slet ikke skrive navnene før din SELECT. Dem i SELECTEN bliver tilføjet. SÅ create table wsvarer () select ....
24. april 2002 - 09:43
#5
Men - undskyld jeg spørger - hvorfor samle til én tabel?
24. april 2002 - 09:46
#6
Fordi jeg har 2 tabeller. En med 220K records og en med 22K records. Kun ~20K poster er komplette. Det vil sige at de indeholder al prisinfo og vareinfo. Derfor vil jeg skære de to tabeller ned til enenkelt tabel på ~20K poster. Jeg skal jo alligevel slå op parallelt. Og desuden mener jeg at et skulle blive hurtigere således?
24. april 2002 - 09:50
#7
Hvis dine WSNR er primær nøgler og dermed indexerede tror jeg ikke du vinder noget mærkbart. Men lav en måling, og se hvad du får ud af det.
24. april 2002 - 09:53
#8
jeg har lavet en måling. Når jeg anvender "SELECT * FROM INFO WHERE PRISER.VVSNR=INFO.VVSNR" troede jeg maskinen gik kold. Det viste sig bare at kaldet tog 24 minutter at behandle på en 633 Celeron m 64. MB RAM. men det var uden at have en primærnøgle. Hvordan genereres den syntaksmessigt og hvordan anvendes den?
24. april 2002 - 09:59
#9
Uden nøgler og indexer så skal det såmæænd nok tage så lang tid.... I din lille tabel er WSNR unik, ikke? Dvs. vi kan bruge den som nøgle. Har du allerede tabellen skal vi nok lave en ALTER ... lad mig nu se... 2 secs
24. april 2002 - 10:02
#10
ALTER TABLE dinlilletabel ADD PRIMARY KEY(WSNR) den skal være sat til NOT NULL, og uden dubletter. Ok? Så er der den store. Er WSNR en fremmednøgle der?
24. april 2002 - 10:03
#11
Nej, også (to be) primærnøgle.
24. april 2002 - 10:04
#12
Og der er heller ikke dubletter i?
24. april 2002 - 10:05
#13
nej heller ikke.
24. april 2002 - 10:06
#14
Jamen så du jo hvad der skal til at afprøve. Jeg venter i spænding ;))
24. april 2002 - 10:10
#15
Jeg har sat en query igang der har kørt i 21 minutter. Jeg vil lige give den 10 minutter mere. Den har før returneret efter 24 minuttter. Men thanx, og jeg vender lige tilbage. (giv lige et svar)
24. april 2002 - 10:12
#16
Ok da. Det er nok 10p værd at blive mindet om indexer - men lad os endelig gøre det færdigt. Der skal måske et index mere på når du skal til at lave forespørgsler.
24. april 2002 - 10:57
#17
ysql> CREATE TABLE VVSVARER -> SELECT -> INFO.VVSNR, -> INFO.Dimension, -> INFO.Overflade, -> INFO.Materiale, -> INFO.Fabrikat, -> INFO.Mærke, -> INFO.Varenavn, -> INFO.Type, -> INFO.Variant, -> INFO.Farve, -> INFO.EANNRtxt, -> PRISER.COST, -> PRISER.UNIT, -> PRISER.AMOUNT -> FROM PRISER, INFO WHERE PRISER.VVSNR = INFO.VVSNR; Query OK, 6535 rows affected (1 hour 8 min 5.43 sec) Records: 6535 Duplicates: 0 Warnings: 0 mysql> show tables; +-----------------------+ | Tables_in_VVS | +-----------------------+ | INFO | | PRISER | | VVSVARER | | active_sessions | | active_sessions_split | | auth_user | | auth_user_md5 | | db_sequence | +-----------------------+ 8 rows in set (0.00 sec) mysql> Jeg tror lige jeg skal til at rode lidt med de der primærnøgler:)
24. april 2002 - 11:01
#18
1 time? Det er da hurtige end at køre i Bilka. Hvad har du lavet? Hvordan kører en almindelig select på f.eks. en bestemt vare?
24. april 2002 - 11:03
#19
Det tar næsen 3 sekunder at finde en vare i den store tabel. Er det nødvendigvis en fordel at anvende datatypen int(9) fremfor varchar(9) i mit indeks?
24. april 2002 - 11:05
#20
Og hvad hvis du finder en vare i den store, og joiner med den lille (dine 2 oprindelige)? Jeg tror ikke der er forskel på at bruge int og char i tid.
24. april 2002 - 11:16
#21
Nu har jeg fået lavet den der key, men jeg er lidt usikker på hvorledes den anvendes. Skal den blot oprettes og så er det bare hurtigt at søge på den eller skal jeg bruge det specielt i min where statement SELECT lfdknvrlkjfv FROM TABLE1, TABLE2 WHERE KEY(sda)?? Hvordan gøres det?
24. april 2002 - 11:35
#22
Du skal søge som du plejer! At der er nøgler og indexer bruger sql-maskinen blot til at gøre noget hurtigere hvis det kan gøres.
24. april 2002 - 12:19
#23
Nu går det stærkt. ~10 sekunder hvor det før tog over en time :)))
24. april 2002 - 12:21
#24
I det mindste er der perspektiver i dette... Hvad præcis for en forespørgsel på 10 sekunder (det er nu også lang tid at vente)
24. april 2002 - 12:22
#25
Ja men det er for at gennemføre et helt script der gør følgende. henter 20K poster ind i en tabel henter 220K poster ind i en anden tabel Kombinerer de to tabeller i en tabel udfra fælles varenumre Søgnunger i den færdige tabel tager ca 0.08 sekunder
24. april 2002 - 12:25
#26
Ok, men jeg tænkte blot på om der skal flere indexer på. Laver du typiske WHERE varenavn='reguleringsskruedimser' så kan et index på varenavn måske gøre det endnu hurtigere.
24. april 2002 - 12:27
#27
OK, det vil jeg arbejde på.. Tak forr hjælpen det har virkeligt hjulpet.. Et sidste spørgsmål på falderebet. Hvor kan jeg læse om hvorledes man nøjes med at vise et udsnit af et resultat som man så kan bladre i. Ligesom når man bladrer i spørgsmålene på eksperten (der vises jo kun en ti stykker ad gangen)
24. april 2002 - 12:32
#28
Computerworld tilbyder specialiserede kurser i database-management