Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[MS SQL]Geneste query met IN of EXISTS?

Pagina: 1
Acties:

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17-11 08:45

Haan

dotnetter

Topicstarter
ik ben een beetje bang dat de oplossing heel simpel is, maar het wil mij tot nu toe niet lukken ;(

Ik probeer een collega te helpen met het volgende:

Hij heeft in een database twee tabellen ingelezen, accounts en contacts. Een contact is gelinkt aan een account (FK is contact.accountid)
Bij het inlezen kon deze koppeling niet mee, wel is er in de account tabel een uniek veld "importID", en bij de contacts ook dit importID om naar het juiste account te verwijzen (dit is dus gewoon hetzelfde als de link tussen account.accountid en contact.contactid, maar dan met een int ipv een guid).

Nu probeer ik dus een query te maken die de oorspronkelijke link weer herstelt.
Ik dacht dat eerst dat dit zou werken:
SQL:
1
2
3
4
5
6
7
8
9
UPDATE contact
SET contact.accountid = account.accountid
WHERE
(
contact.importID IN 
(
SELECT account.importID
FROM account
))

Dat geeft de contacts waarbij het importID gelijk is aan die van een account, maar dan heb ik het accountid van het account er niet bij. De accountid mee selecteren in de laatste subquery kan niet, maar ik zie even niet hoe ik dat wel doe, EXISTS gebruiken ipv IN?

Kater? Eerst water, de rest komt later


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Lees de multiple table [url=vhttp://dev.mysql.com/doc/refman/5.0/en/update.html]update syntax[/] nog een keer?

{signature}


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17-11 08:45

Haan

dotnetter

Topicstarter
Voutloos schreef op donderdag 03 juli 2008 @ 13:16:
Lees de multiple table [url=vhttp://dev.mysql.com/doc/refman/5.0/en/update.html]update syntax[/] nog een keer?
Dat had ik al geprobeerd ('update contact, account' etc), maar die syntax is niet correct. Ik zie dat ik ook een foutje heb gemaakt in de titel, ik werk met SQL 2005, dat is Transact-SQL, niet MySQL.

@Janoz: dank :)

Kater? Eerst water, de rest komt later


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 08:25

Janoz

Moderator Devschuur®

!litemod

Ik heb de topictitel even voor je aangepast. Dat lijkt me wel redelijk relevant voor de oplossing.

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


Verwijderd

is het niet zoiets:

update contact, account
set contact.accountid = account.accountid
where contact.importid = account.importid

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17-11 08:45

Haan

dotnetter

Topicstarter
Ik heb het volgens mij nu wel gevonden op msdn:

Je moet gewoon nog een FROM <tabel> erbij zetten, dus
SQL:
1
2
3
4
5
6
7
8
9
10
UPDATE contact
SET contact.accountid = account.accountid
FROM account
WHERE
(
contact.importID IN 
(
SELECT account.importID
FROM account
))

werkt wel :)

verradelijk dat die syntax dus net iets anders is

EDIT: te vroeg gejuicht, deze query hangt alle contacts onder 1 account..

[ Voor 18% gewijzigd door Haan op 03-07-2008 14:04 ]

Kater? Eerst water, de rest komt later


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:22
code:
1
2
3
4
UPDATE contact
set contact.account id = account.accountid
FROM account
WHERE contact.importid = account.importid

https://fgheysels.github.io/


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 17-11 08:45

Haan

dotnetter

Topicstarter
whoami schreef op donderdag 03 juli 2008 @ 14:10:
code:
1
2
3
4
UPDATE contact
set contact.account id = account.accountid
FROM account
WHERE contact.importid = account.importid
Zo makkelijk is het helaas niet geloof ik, ik had voor het overzicht even weggelaten dat er ook een check is dat het alleen gaat om records die op de dag zelf zijn ingelezen, dus dan heb je dit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
UPDATE contact
SET contact.accountid = account.accountid
FROM account
WHERE
(
contact.importID IN 
(
SELECT account.importID
FROM account
WHERE (DATEDIFF(d, account.createdon, GETDATE()) = 0)
)
)

zou het kunnen dat ik de set regel door dit moet vervangen:
code:
1
SET contact.accountid = (SELECT accountid from account where contact.accountid = account.accountid)


(het is voor mij lastig te testen, ik moet eerst de pc van een collega remote overnemen en dan via een remote desktop werken die weer wordt geopend vanaf een machine die draait in een virtual pc :/ )

[ Voor 22% gewijzigd door Haan op 03-07-2008 14:52 ]

Kater? Eerst water, de rest komt later


  • Cousin Boneless
  • Registratie: Juni 2008
  • Laatst online: 28-02 12:55
Laatst ook zo'n probleem. Aangezien het nogal verwarrend is hoe de tabel achter de update gerelateerd is aan de from (en niet expliciet aan elkaar hoeft te joinen) gebruik ik sindsdien de volgende notatie:

SQL:
1
2
3
4
5
update c
set c.accountid = a.accountid
from contact c
inner join account a on c.importid = a.importid
where datediff(d, a.createdon, getdate()) = 0
Pagina: 1