[SQL] ALTER TABLE / CONCAT

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Stel ik heb een eenvoudige tabel X met daarin kolommen A en B, allen text opgemaakt.

Met

SELECT *, A+B AS AB
FROM tbl.X;

krijg ik de gewenste output, echter nog niet in de vorm van een nieuwe tabel.

Iemand een idee voor een query die een kolom aan tbl.X toevoegt met daarin A+B? Denk zelf aan een alter tabel icm bovenstaande subquery...maar kom er niet helemaal uit! Ik wil dus de bestaande tbl aanpassen en aanvullen met kolom AB middels een concat functie

thnx!

lowpass

Acties:
  • 0 Henk 'm!

  • IntToStr
  • Registratie: December 2003
  • Nu online
Kun je niet gewoon eerst een alter table uitvoeren waarbij je een kolom AB toevoegt en daarna een update doen waarbij voor elke row die waarde gevuld wordt?

Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Vrij simpel in het geval van MSSQL:
ALTER TABLE tbl.X ADD COLUMN Ab AS A + B (PERSISTED)

De database houd dan ook column Ab in sync als de waarde van A of B mocht wijzigen.

[ Voor 33% gewijzigd door Niemand_Anders op 06-09-2010 14:20 . Reden: sync update toegevoegd ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 24-08 23:40

Killemov

Ik zoek nog een mooi icooi =)

Als A+B een vervanging is voor de losse kolommen dan:
code:
1
2
update mytable set A = A||B;
alter table mytable drop column B;

Als dat niet het geval is, niet doen! Je wilt pertinent geen inconsistentie in je database. Dan kun je beter een view gebruiken.

Hey ... maar dan heb je ook wat!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
@inttostr: voorkeur is natuurlijk om het in 1 query te krijgen ;-) Wat zou jouw idee zijn voor een aparte update query?

@n_a: moet in access gebeuren dus geen mysql. Met ALTER TABLE tbl.X ADD AB varchar(2) AS A + B; krijg ik een syntax error

@killemov: nope...AB is geen vervaning voor A of B. Na de update dient de tbl 3 kolommen te bevatten, A, B en A+B

[ Voor 19% gewijzigd door Verwijderd op 06-09-2010 16:19 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Waar komt de voorkeur vandaan om het in niet meer dan één query te doen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Janoz schreef op maandag 06 september 2010 @ 16:19:
Waar komt de voorkeur vandaan om het in niet meer dan één query te doen?
Schaamteloze gemakzucht.... ;)
En omdat er tzt ook anderen mee moet werken die minder handig zijn met queries.

Maar een recept voor meerdere queries zou ik voornu (testfase) ook eerst prima vinden hoor!
Bring it on...

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 12:19

lier

MikroTik nerd

Verwijderd schreef op maandag 06 september 2010 @ 16:38:
Schaamteloze gemakzucht.... ;)
En omdat er tzt ook anderen mee moet werken die minder handig zijn met queries.

Maar een recept voor meerdere queries zou ik voornu (testfase) ook eerst prima vinden hoor!
Bring it on...
Gemakzucht...zo komt het ook enorm over...
Het zou je niet misstaan om in ieder geval de schijn op te houden dat je zelf ook actief mee denkt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
ALTER TABLE table {ADD {COLUMN field type[(size)] [NOT NULL] [CONSTRAINT index] |
ALTER COLUMN field type[(size)] |
CONSTRAINT multifieldindex} |
DROP {COLUMN field I CONSTRAINT indexname} }
 ALTER TABLE statement has these parts:
Part    Description
table   The name of the table to be altered.
field   The name of the field to be added to or deleted from table. Or, the name of the field to be altered in table.
type    The data type of field.
size    The field size in characters (Text and Binary fields only).
index   The index for field.
multifieldindex     The definition of a multiple-field index to be added to table.
indexname   The name of the multiple-field index to be removed.


Probeer in eerste instantie te vertellen waarom je het wil.
Daarna wat je al gedaan hebt.
Tot slot waarom het je niet lukt.
krijg ik de gewenste output, echter nog niet in de vorm van een nieuwe tabel.
Wat bedoel je met nieuwe tabel ?
Bedoel je nu CREATE TABLE ?
Waar heb je een nieuwe tabel voor nodig ?
Waarom heb je de concatinatie van de twee kolommen nodig en kan je dat niet in je presentatie laag afhandelen ?

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Access ondersteund volgens mij geen triggers, dus als je die kolom A+B wilt maken zul je zelf moeten zorgen dat de waarde blijft kloppen. Of je kunt een query maken die A+B uitrekent. Die query kun je dan behandelen als tabel.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoho...das niet helemaal fair. Het 'gemakzucht' was een reactie waarom eea in 1 query te ondervangen...niet waarom ik de vraag hier stel! Degene die straks met de tool moet werken moeten zo min mogelijk handelingen verrichten. Heb uiteraard zelf eerst ook lopen pielen...en doe dat nu ook nog adhv jullie suggesties, waarvoor dank btw.

Ter verduidelijking dan: De query SELECT *, A+B AS AB FROM tbl.X; geeft eigenlijk al het gewenste resultaat weer (in access).
Op basis van een tabel met een A en een B volgt A+B als derde, nieuwe column. Punt is echter dat het dan nog steeds in 'datasheet view' wordt weergegeven. Ik wil echter de output van de query in een nieuwe tabel hebben / of wil de bestaande tabel met de gewenste column uitbereiden.

En dat lukt me nu net niet...helaas. Zelf dacht ik aan een combi van alter tabel met een subquery met de concat daarin (hence: topic title)...maar blijk daar onvoldoende in thuis te zijn om het werkend te krijgen en betwijfel nu of dit zo mogelijk is.

[ Voor 14% gewijzigd door Verwijderd op 06-09-2010 17:25 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 06 september 2010 @ 17:23:
Degene die straks met de tool moet werken moeten zo min mogelijk handelingen verrichten.
Mijn ervaring is, dat als de gebruiker wijzigingen in de tabelstructuur moet aanbrengen er bijna per definitie een fout ontwerp aan ten grondslag ligt. Tabelstructuur wijzig je als je functionaliteit verandert, niet tijdens het gebruik.

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 12:19

lier

MikroTik nerd

Verwijderd schreef op maandag 06 september 2010 @ 17:23:
Hoho...das niet helemaal fair....enz...
Je hebt een beetje gelijk, impliciet is het als tip bedoeld om je topic uit te breiden met alle informatie (wat heb je geprobeerd, waar loop je tegen aan, enz).

Verder is het misschien een goed idee om eens te kijken naar de mogelijkheden van queries, die kunnen alles (en meer) waar jij naar op zoek bent. Wat is jouw rol en functie eigenlijk in dit verhaal ?

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

  • Freeaqingme
  • Registratie: April 2006
  • Laatst online: 12:39
Je kan er ook een view van maken. Daarnaast heeft MariaDb (een drop-in replacement/fork voor/van Mysql) vanaf 5.2 ondersteuning voor virtual columns.

No trees were harmed in creating this message. However, a large number of electrons were terribly inconvenienced.


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Ik was al bang dat het hier om een terugkerende query ging ipv een éénmalige conversie actie. Het lijkt me eerder dat er iets fundamenteel mis is met de implemetatie van je stuk software wanneer je daadwerkelijk zulke tabel structuur veranderende acties in je normale gebruik nodig hebt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Janoz schreef op maandag 06 september 2010 @ 19:04:
Ik was al bang dat het hier om een terugkerende query ging ipv een éénmalige conversie actie. Het lijkt me eerder dat er iets fundamenteel mis is met de implemetatie van je stuk software wanneer je daadwerkelijk zulke tabel structuur veranderende acties in je normale gebruik nodig hebt.
...nog naast het feit dat áls je het al nodig hebt, je beter een view kan gebruiken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mijn rol in deze is puur faciliterend...het betreft een werkgerelateerde situatie nl. Mijn afdeling heeft een hoop data van een klant ontvangen en ingelezen in een statistisch pakket. Dit pakket (vrij oud) biedt echter (helaas) niet de mogelijkheid om 2 columns te concatten. Dit is nodig om de klant data te bewerken (voor en achternamen joinen in 1 column, in mijn voorbeeld A en B leidt tot AB)
Vandaar dat ik een workaround via access zoek. De data is te omvangrijk voor excel..anders had ik dat idd wel geprobeerd ;)

Ik dump dus die hele db in access. Dat is ook de reden waarom ik de bestaande tabelstructuur wil editten. De geedite tabel kan ik dan weer teruglezen in het pakket van de baas. Pakket kan enkel tabbelen inlezen, geen views of query-output oid.

Tot zover heb ik wel met een losse query een colum kunnen toevoegen (ALTER TABLE tbl.X ADD AB varchar(255);...die is niet zo lastig nog he.

Nu blijf ik echter steken hoe deze nieuwe column af te vullen met de gewense concat statement. Ik kan geen query bedenken die dit succesvol uitvoert.

Nogmaals, als eea wel in 2 aparte queries kan, ook prima. Het gaat hier in eerste instantie gewoon om een eenmalige conversie...al kan de werkwijze in de toekomst natuurlijk ook in vergelijkbare situaties worden toegepast indien nodig.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En je kan geen view maken?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Had ik idd ook al ff aan lopen denken, maar nope...

http://www.helpmij.nl/for...QL-Create-view-werkt-niet

Daarbij blijft de view een soort verkapte query. Het pakket waar de data waar in moet kan alleen maar inlezen vanuit een tbl

Acties:
  • 0 Henk 'm!

  • IntToStr
  • Registratie: December 2003
  • Nu online
IntToStr schreef op maandag 06 september 2010 @ 14:10:
Kun je niet gewoon eerst een alter table uitvoeren waarbij je een kolom AB toevoegt en daarna een update doen waarbij voor elke row die waarde gevuld wordt?
Welk gedeelte hiervan is dan niet mogelijk voor je als het ook in 2 queries mag?

Heb je iets als procedures in access? Dan kun je meerdere queries in 1 statement uitvoeren.

Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 12:10
SELECT INTO al eens geprobeerd?

Is (uit mijn hoofd) iets van SELECT A+B AS ... INTO... table ... COLUMN etc. :)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

SELECT INTO is onzin. een UPDATE tabel SET nieuweKolom = A+B is genoeg. Ik blijf het echter vreemd vinden dat een view niet werkt. Een view ziet er voor de gebruiker van die view niet anders uit dan een tabel. Het enige dat anders is is dat de 'tabel' niet (zomaar) te wijzigen is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ah...zat dus ook de hele tijd met select into maar Janoz geeft de doorslag...en eigenlijk inttostr ook al in post#2. In 2 stappen heb ik nu het resultaat zoals ik het wil hebben....de originele tabel met een column extra na bewerking!\.

code:
1
2
ALTER TABLE tbl.X 
ADD AB varchar (255);

vervolgens
code:
1
2
UPDATE tbl.X 
SET AB = A+B;


Super...thnx voor het meedenken. Ik wil het niet pushen maar...kan je dit nog in 1 query krijgen..heb geen procedures voorzover aangemaakt.

[ Voor 9% gewijzigd door Verwijderd op 07-09-2010 16:05 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Het aanpassen van de structuur van de database en het aanpassen van de data daarin zijn nu eenmaal 2 compleet andere handelingen. Dat in 1 query proberen te fietsen zal sowieso iets opleveren dat er een stuk ingewikkelder uit ziet dan deze twee losse queries.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 12:19

lier

MikroTik nerd

Je zou een query kunnen maken met een transactie mechanisme (BEGIN TRAN) met daaronder de twee statements (tabel maken en update uitvoeren) en afsluiten met een COMMIT TRAN (en indien fout met een ROLLBACK TRAN).

Wat is het voordeel van beide statements in één query plaatsten ?
Is dit iets dat vaker gedaan moet worden ?

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mja...niet zo veel heel verder. Puur ter lering ende vermaeck zeg maar...mocht het vaker gaan gebeuren kruipt ik zelf wel even achter de knoppen.

Wat Janoz ook al terecht opmerkt...eea wordt vele malen complexer dan het nu is...kosten-baten analyse zegt me dan: niet doen :-)

Thnx voor het meedenken. Wat mij betreft zijn we er klaar mee. Query heeft gedraaid en mijn data in minuutje of 2 netjes geupdate. Tabel weer in het pakket van de baas...iedereen weer happy!

Acties:
  • 0 Henk 'm!

  • drStrangepork
  • Registratie: September 2010
  • Laatst online: 26-12-2024
code:
1
2
ALTER TABLE tbl.X 
ADD AB varchar (255);

vervolgens
code:
1
2
UPDATE tbl.X 
SET AB = A+B;


Super...thnx voor het meedenken. Ik wil het niet pushen maar...kan je dit nog in 1 query krijgen..heb geen procedures voorzover aangemaakt.
[/quote]

1 query? U vraagt wij draaien:

Begin
exec sp_executeSql 'ALTER TABLE tbl.X ADD AB varchar (255)';

UPDATE tbl.X SET AB = A+B;
End

Dit wil je niet, maar het is 1 statement.

Edit:
MsSql code dan wel te verstaan.
Edit2: exec sp_executeSql ipv Execute Immediate. dit laatste is het Oracle equivalent.

[ Voor 14% gewijzigd door drStrangepork op 08-09-2010 18:52 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
drStrangepork schreef op woensdag 08 september 2010 @ 17:53:
1 query? U vraagt wij draaien:

Begin
Execute immediate 'ALTER TABLE tbl.X ADD AB varchar (255)';

UPDATE tbl.X SET AB = A+B;
End

Dit wil je niet, maar het is 1 statement.

Edit:
MsSql code dan wel te verstaan.
Het zijn sowieso verschillende statements; dat ze gegroepeerd zijn in een compound statement is andere koek. Sowieso mix je DDL met DML. Either way; dit "1 statement" noemen is jezelf voor de gek houden.

Verder zie ik even het nut van de Execute immediate niet tenzij je je quotes verkeerd hebt staan en de hele zut in de execute wou hebben en het daarmee "1 statement" wou noemen. En bij mijn weten is "immediate" een Embedded SQL only-iets. SQL Server 2000 t/m 2008 geven bij mij althans:
execute immediate 'select * from sometable'
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'immediate'.

[ Voor 30% gewijzigd door RobIII op 08-09-2010 18:45 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • drStrangepork
  • Registratie: September 2010
  • Laatst online: 26-12-2024
RobIII schreef op woensdag 08 september 2010 @ 18:18:
[...]


Het zijn sowieso verschillende statements; dat ze gegroepeerd zijn in een compound statement is andere koek. Sowieso mix je DDL met DML. Either way; dit "1 statement" noemen is jezelf voor de gek houden.
De aanduiding "1 statement" is, laten we zeggen, rekbaar maar het wordt als 1 blok uitgevoerd. En geeft ook mogelijkheden om in een stored procedure te gieten. E.e.a. komt denk ik in de richting van de vraagstelling van topic starter. Schoonheidsprijzen win je er niet mee. Zoveel wil ik toegeven. Zoals gezegd: "Dit wil je niet".
Verder zie ik even het nut van de Execute immediate niet tenzij je je quotes verkeerd hebt staan en de hele zut in de execute wou hebben en het daarmee "1 statement" wou noemen. En bij mijn weten is "immediate" een Embedded SQL only-iets. SQL Server 2000 t/m 2008 geven bij mij althans:
[...]
Hm het blijkt dat ik Oracle code heb getyped. Chapeu; I stand corrected. exec sp_executeSql 'string met een DDL statement erin' werkt wel degelijk. Heb op dit moment ff geen MsSql db bij de hand om het te bewijzen, maar bijvoorbeeld hier http://stackoverflow.com/...a-sqlserver-2005-function staat een voorbeeld.

Overigens nogmaals: Dit wil je niet, het is alleen mogelijk.
Pagina: 1