Problemet är:
... WHERE [b]id[/b] IN (SELECT [b]epost[/b]
Vad vill du med det villkoret egentligen?
Databaser & SQLur Databashanterare & SQL
9 svar · 432 visningar · startad av CokeLight
Hejsan, jag skulle vilja plocka ut allt som står före @ tecknet för alla poster i en tabell.. det går för en en post i taget om jag sätter WHERE id = 3 men hur gör man för hela SELECT'n...?
SELECT SUBSTRING(epost, 1,
(
(SELECT CHARINDEX('@', epost) FROM personal WHERE id IN (SELECT epost FROM personal)) - 1)
) FROM personal
ger mig följande fel:
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the varchar value 'xyz.abc@123.se' to a column of data type int.
SELECT SUBSTRING(epost, 1,
(
(SELECT CHARINDEX('@', epost) FROM personal WHERE id = 3) - 1)
) FROM personal WHERE id = 3
funkar ju men jag vill ha en loop..? :)
Problemet är:
... WHERE [b]id[/b] IN (SELECT [b]epost[/b]
Vad vill du med det villkoret egentligen?
hejsan @nders.. :) jag gissade bara iofs.. om jag bara skriver
SELECT SUBSTRING(epost, 1,
(
(SELECT CHARINDEX('@', epost) FROM personal) - 1)
) FROM personal
får jag felet:
Server: Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
men jag läste fel helt och hållet kom jag ju på.. jag fick för mig att det stod nåt i stil med att Subquery BARA returnerade ett värde och att flera värden måste returneras i sammanhanget o provade därför med "IN".. men det blev ju galet hursomhelst... :) några förslag..?
Jag förstår inte riktigt varför du ska ha en subquery överhuvudtaget?
SELECT SUBSTRING(epost, 1, CHARINDEX('@', epost)) AS foo FROM personal
hehe.. absolut.. ! vet inte vad jag tänkte på.. sitter o nickar till här borta.. halvsovande.. (fredag o allt ;) gracias.. !!
hej igen.. lite följdfrågor..
nu vill jag göra insert i en kolumn baserad på den SELECT'en jag frågade om tidigare...
så när jag skriver:
INSERT INTO personal(id, .... , abc)
(select id, ... , SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) from personal_old)
(där personal_old är en exakt replica av personal).
får jag felmeddelande:
Server: Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'personal' when IDENTITY_INSERT is set to OFF.
... så jag tänkte att jag deletar allt från personal först:
delete personal cascade constraint
drop table personal cascade constraint
men cascade constraint funkar inte riktigt här.. (har för mig att det gick i Oracle..?)
(jag kör så här eftersom jag inte vet enklare sätt.. :) ) Jag provade även att göra UPDATE men kom inte på hur jag skulle skriva UPDATE..
UPDATE personal SET xyz =
(
SELECT SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) AS xyz FROM personal_old WHERE epost <> ''
)
WHERE personal.id = personal_old.id
felmsg:
Server: Msg 107, Level 16, State 3, Line 1
The column prefix 'personal_old' does not match with a table name or alias name used in the query.
så jag har inga fler idéer.. så hur kan jag göra en insert/update med dessa värden...??
Om du vill ha samma id-nummer i personal som du har i personal_old
set identity_insert on
INSERT INTO personal(id, .... , abc)
select id, ... , SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) from personal_old
set identity_insert off
Om du vill ha nya id-värden
INSERT INTO personal( .... , abc)
select ... , SUBSTRING( epost, 1, (CHARINDEX('@', epost)-1) ) from personal_old
Om du vill ta bort alla rader ur en tabell
delete from personal
UPDATE personal SET xyz =
(SELECT SUBSTRING(epost, 1, (CHARINDEX('@', epost)-1) )
FROM personal_old
WHERE epost <> ''
and personal.id = personal_old.id)
where id in (select id from personal_old)
hej hej.. kom hem precis.. ah, UPDATE satsen längst ner är lysande.. fungerade på en gång !! :) jättebra.. tack
orsaken varför jag provade att ha cascade constraint var att jag fick felet
Server: Msg 547, Level 16, State 1, Line 1
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_plats_personal'. The conflict occurred in database 'Personal', table 'plats', column 'Personal_Id'.
The statement has been terminated.
och har för mig att det där cascade constraint, på nåt sätt, vet inte exakt varför, men att det kringgick eventuella integrity checks (?)
aha.. det var bra.. att man skrev set identity insert on.. oki..
och.. är det så att om man inte har "WHERE id IN..." på slutet så kommer det att stå att personal_old inte finns med i queryn, eller..? För det felmeddelandet fick jag förut när jag satt o testade o kom inte på hur man skulle göra..
men bra.. då lärde jag mig mycket idag :)
Det fel du får beror på en konflikt på grund av en foreign key. Du försöker ta bort en post som refereras från en annan tabell. Du kan få de posterna att tas bort automatiskt vid delete i huvudtabellen om du definierar din foreign key med on delete cascade. Det är inget som kan styras när man gör delete.
cascade kan enbart anges vid drop/revoke. SQL server stöder inte cascade alls. Varianten med cascade constraints är icke-standard och finns enbart i Oracle.
Att jag har med
where id in ( ...)
i update är enbart för att inte uppdatera de poster som inte finns med i personal_old
aha.. okay, så man ska specificera on delete kommando..
bra.. då förstår jag också where id in.. tack så mycket för svaren.. :)