Vinnaren i pepparkakshustävlingen!
2016-04-12, 15:28
  #1
Medlem
Jag är fast på en SQL uppgift där man ska ta fram de lokaler som eleverna från Kista har gått kurser i, men jag får dubletter av lokaler.

Det här är koden jag skrivit hittills:

Kod:
SELECT XMLELEMENT(NAME "Elev", XMLATTRIBUTES(enamn AS "namn"),
					XMLELEMENT(NAME "Lokal", Ktillf.lokal))
FROM Elev, Deltag, Ktillf
WHERE eid = elev 
AND Deltag.kurs = Ktillf.kurs AND Deltag.sdat = Ktillf.sdat
AND XMLEXISTS('$K//adress[@postort = "Kista"]'
PASSING kontakt as "K")

Och resultatet jag får hittills:
HTML-kod:
<Elev namn="Ann Stål"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Robert Ahl"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Orion</Lokal></Elev>

Men namnen på lokalerna blir dubletter.
Jag behöver hjälp med att ta bort dubletterna från lokalerna.

All hjälp uppskattas!
Citera
2016-04-12, 15:40
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av klane
Jag är fast på en SQL uppgift där man ska ta fram de lokaler som eleverna från Kista har gått kurser i, men jag får dubletter av lokaler.

Det här är koden jag skrivit hittills:

Kod:
SELECT XMLELEMENT(NAME "Elev", XMLATTRIBUTES(enamn AS "namn"),
					XMLELEMENT(NAME "Lokal", Ktillf.lokal))
FROM Elev, Deltag, Ktillf
WHERE eid = elev 
AND Deltag.kurs = Ktillf.kurs AND Deltag.sdat = Ktillf.sdat
AND XMLEXISTS('$K//adress[@postort = "Kista"]'
PASSING kontakt as "K")

Och resultatet jag får hittills:
HTML-kod:
<Elev namn="Ann Stål"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Robert Ahl"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Orion</Lokal></Elev>

Men namnen på lokalerna blir dubletter.
Jag behöver hjälp med att ta bort dubletterna från lokalerna.

All hjälp uppskattas!
Det ser ju ut att saknas en join, var joinar du in eleven på deltagaren i kursen? Tycker inte jag får nån klarhet i det?

Hur ser datat ut btw?
Citera
2016-04-12, 23:36
  #3
Medlem
Tack så mycket. Jag har börjat förstå JOIN och så och får det att fungera men nu fastnar jag på att jag får dubbletter på Elever;

Nu ser min kod ut såhär:

Kod:
SELECT XMLELEMENT(NAME "Elev", XMLATTRIBUTES(enamn AS "namn"),
					XMLELEMENT(NAME "Lokal", Ktillf.lokal))
FROM Elev, Ktillf
JOIN Deltag 
ON Ktillf.kurs = Deltag.kurs

WHERE eid = elev 
AND Deltag.kurs = Ktillf.kurs AND Deltag.sdat = Ktillf.sdat
AND XMLEXISTS('$K//adress[@postort = "Kista"]'
PASSING kontakt as "K")


Och får resultatet:

HTML-kod:
 <Elev namn="Ann Stål"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Robert Ahl"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Orion</Lokal></Elev>

Men jag vill att det ska vara sådan struktur i resultatet:

HTML-kod:
 <Elev namn="">
       <Lokal>lokalens namn</Lokal>
       <Lokal>lokalens namn</Lokal>
 </Elev>
 <Elev namn="">
           <Lokal>lokalens namn</Lokal>
           <Lokal>lokalens namn</Lokal>
 </Elev> 

Jag vill alltså inte ha dubletter för elevers namn, det ska stå lokaler som eleverna i Kista har haft kurser i under varje elev.

Uppskattar all hjälp
Citera
2016-04-13, 08:06
  #4
Moderator
Protons avatar
Citat:
Ursprungligen postat av klane
Tack så mycket. Jag har börjat förstå JOIN och så och får det att fungera men nu fastnar jag på att jag får dubbletter på Elever;

Nu ser min kod ut såhär:

Kod:
SELECT XMLELEMENT(NAME "Elev", XMLATTRIBUTES(enamn AS "namn"),
					XMLELEMENT(NAME "Lokal", Ktillf.lokal))
FROM Elev, Ktillf
JOIN Deltag 
ON Ktillf.kurs = Deltag.kurs

WHERE eid = elev 
AND Deltag.kurs = Ktillf.kurs AND Deltag.sdat = Ktillf.sdat
AND XMLEXISTS('$K//adress[@postort = "Kista"]'
PASSING kontakt as "K")


Och får resultatet:

HTML-kod:
 <Elev namn="Ann Stål"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Robert Ahl"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Orion</Lokal></Elev>

Men jag vill att det ska vara sådan struktur i resultatet:

HTML-kod:
 <Elev namn="">
       <Lokal>lokalens namn</Lokal>
       <Lokal>lokalens namn</Lokal>
 </Elev>
 <Elev namn="">
           <Lokal>lokalens namn</Lokal>
           <Lokal>lokalens namn</Lokal>
 </Elev> 

Jag vill alltså inte ha dubletter för elevers namn, det ska stå lokaler som eleverna i Kista har haft kurser i under varje elev.

Uppskattar all hjälp
Föreslår att du till att börja med läser igenom tråden (FB) Främmande nycklar(Och sql join)(/mod) för däri finns ett utförligt resonemang om joinar.

Du har ju satsen
Kod:
JOIN Deltag 
ON Ktillf
.kurs Deltag.kurs 
i din sql nu, finns det då nån anledning till att du har
Kod:
AND Deltag.kurs Ktillf.kurs 
i ditt wherevillkor? Varför finns den där och vad tillför den?

Datat i resultatet nu verkar ju vara unikt, du har ju tre "ann stål" exempelvis, men dessa förekomster har ju olika lokaler. Urvalet förefaller med andra ord vara korrekt, men däremot kanske den inte riktigt är friserad på det sätt du vill.

Vad är det för db du använder btw? Sql server, eller vad?
Citera
2016-04-13, 08:14
  #5
Moderator
Protons avatar
Citat:
Ursprungligen postat av klane
Tack så mycket. Jag har börjat förstå JOIN och så och får det att fungera men nu fastnar jag på att jag får dubbletter på Elever;

Nu ser min kod ut såhär:

Kod:
SELECT XMLELEMENT(NAME "Elev", XMLATTRIBUTES(enamn AS "namn"),
					XMLELEMENT(NAME "Lokal", Ktillf.lokal))
FROM Elev, Ktillf
JOIN Deltag 
ON Ktillf.kurs = Deltag.kurs

WHERE eid = elev 
AND Deltag.kurs = Ktillf.kurs AND Deltag.sdat = Ktillf.sdat
AND XMLEXISTS('$K//adress[@postort = "Kista"]'
PASSING kontakt as "K")


Och får resultatet:

HTML-kod:
 <Elev namn="Ann Stål"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Robert Ahl"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Sigge Ehn"><Lokal>Sirius</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Jupiter</Lokal></Elev>
 <Elev namn="Siw Björk"><Lokal>Orion</Lokal></Elev>
 <Elev namn="Ann Stål"><Lokal>Orion</Lokal></Elev>

Men jag vill att det ska vara sådan struktur i resultatet:

HTML-kod:
 <Elev namn="">
       <Lokal>lokalens namn</Lokal>
       <Lokal>lokalens namn</Lokal>
 </Elev>
 <Elev namn="">
           <Lokal>lokalens namn</Lokal>
           <Lokal>lokalens namn</Lokal>
 </Elev> 

Jag vill alltså inte ha dubletter för elevers namn, det ska stå lokaler som eleverna i Kista har haft kurser i under varje elev.

Uppskattar all hjälp
Efter lite googling skulle det ju kunna vara Oracle med....

Kod:
SELECT XMLELEMENT(NAME "Elev", XMLATTRIBUTES(enamn AS "namn"),
					XMLELEMENT(NAME "Lokal", Ktillf.lokal))
FROM Elev, Ktillf
JOIN Deltag 
ON Ktillf.kurs = Deltag.kurs

WHERE eid = elev 
AND Deltag.kurs = Ktillf.kurs AND Deltag.sdat = Ktillf.sdat
AND XMLEXISTS('$K//adress[@postort = "Kista"]'
PASSING kontakt as "K")



Vad kommer eid ifrån i din fråga? Vad är "elev"? Hur ser datat ut om igen?

Hittade sidan https://docs.oracle.com/cd/B19306_01...nctions220.htm där exemplet
Kod:
SELECT XMLELEMENT("Emp"XMLATTRIBUTES(e.employee_ide.last_name),
   
XMLELEMENT("Dept"XMLATTRIBUTES(e.department_id,
   (
SELECT d.department_name FROM departments d
   WHERE d
.department_id e.department_id) as "Dept_name")),
   
XMLELEMENT("salary"e.salary),
   
XMLELEMENT("Hiredate"e.hire_date)) AS "Emp Element"
   
FROM employees e
   WHERE employee_id 
205
Verkar vara precis det du är ute efter? Vad händer till exempel om du i subqueryn selectar ut alla lokaler (eller vad du nu skulle ha tag i), då borde ju datat räta ut sig?
__________________
Senast redigerad av Proton 2016-04-13 kl. 08:18.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback