Vinnaren i pepparkakshustävlingen!
2010-02-23, 07:34
  #1
Medlem
Hallå!

Har fastnat på en smärre uppgift, och vänder mig nu till er för tips & råd.

Uppgiften lyder:

Hitta de företag som har åtm. en anställd på alla de städer där det överhuvudtaget
bor arbetstagare.


Kod:
Under works

employee_name	|	company_name	|	salary



Under employee

employee_name	|	street		|	city


Prövat med att inner joina dom X antal gånger och ha varje stad som krav under WHERE, men går icke.

Några idéer?


Tack!
__________________
Senast redigerad av Plomeros 2010-02-23 kl. 07:38.
Citera
2010-02-23, 10:04
  #2
Moderator
pewpews avatar
Två tabeller?
Citera
2010-02-23, 10:18
  #3
Medlem
Citat:
Ursprungligen postat av pewpew
Två tabeller?

ja.
Citera
2010-02-23, 10:49
  #4
Medlem
desmoduss avatar
Jag antar att employee_name och company_name agerar nycklar?

Och du behöver bara ha ut företag? Inte antal anställda fördelat på stad eller liknande?

Men den givna tabelluppsättningen räcker det ju isåfall med en vanlig inner join:
Kod:
select distinct company_name from works w 
inner join employee e on w
.employee_name e.employee_name 
Citera
2010-02-23, 11:25
  #5
Moderator
pewpews avatar
löste desmodus dina problem?
Citera
2010-02-23, 11:28
  #6
Medlem
Citat:
Ursprungligen postat av desmodus
Jag antar att employee_name och company_name agerar nycklar?

Och du behöver bara ha ut företag? Inte antal anställda fördelat på stad eller liknande?

Men den givna tabelluppsättningen räcker det ju isåfall med en vanlig inner join:
Kod:
select distinct company_name from works w 
inner join employee e on w
.employee_name e.employee_name 

Det där ger ut en tabell med dom 2 kombinerade, vilket är första steget till uppgiften. Men uppgiften är efter alla bolag som har anställda på alla de platser där de överhuvudtaget bor några arbetaren för någon av företagen.

Jag gjorde detta som försök.

Kod:
SELECT * FROM employee as s
INNER JOIN works AS w1 ON w1.employee_name = s.employee_name
INNER JOIN employee AS w2 ON w2.employee_name = s.employee_name
INNER JOIN employee AS w3 ON w3.employee_name = s.employee_name
WHERE w2.city = 'Washington' AND w3.city='London'
(fattas några städer ännu)

Men tyvärr fungerar det inte av någon orsak som jag inte vet, i och med att jag användt detta förut.
Citera
2010-02-23, 11:55
  #7
Medlem
desmoduss avatar
Citat:
Ursprungligen postat av Plomeros
Det där ger ut en tabell med dom 2 kombinerade, vilket är första steget till uppgiften. Men uppgiften är efter alla bolag som har anställda på alla de platser där de överhuvudtaget bor några arbetaren för någon av företagen.

Ok, då förstår inte jag uppgiften i kombination med tabellstrukturen du angav. Du säger att du vill ha ut företag, men gör en select * över employee och works.

Kan du visa hur du vill att resultat-settet ska se ut?
Citera
2010-02-23, 14:33
  #8
Medlem
Citat:
Ursprungligen postat av desmodus
Ok, då förstår inte jag uppgiften i kombination med tabellstrukturen du angav. Du säger att du vill ha ut företag, men gör en select * över employee och works.

Kan du visa hur du vill att resultat-settet ska se ut?

SELECT employee_name, city, company_name from employee natural join works
ger:

http://upit.cc/images/0239ec96.png

Jag behöver en SQL sats som ger namnet på de bolag som har en anställd där det överhuvudtaget finns en anställd för någon av bolagen. I detta fall har Nokia och Kotipizza det.
Citera
2010-02-23, 15:23
  #9
Moderator
Protons avatar
Prova denna?
Kod:
SELECT company_name FROM works WHERE EXISTS(
SELECT employee_name FROM employee
INNER JOIN works ON works.employee_name = employee.employee_name)
Citera
2010-02-23, 15:57
  #10
Medlem
Citat:
Ursprungligen postat av Proton
Prova denna?
Kod:
SELECT company_name FROM works WHERE EXISTS(
SELECT employee_name FROM employee
INNER JOIN works ON works.employee_name = employee.employee_name)

Inte vad jag är ute efter tyvärr, det där ger bolagen som överhuvudtaget har några arbetaren (dvs alla bolag).
Citera
2010-02-23, 21:02
  #11
Medlem
desmoduss avatar
Citat:
Ursprungligen postat av Plomeros
SELECT employee_name, city, company_name from employee natural join works
ger:

http://upit.cc/images/0239ec96.png

Jag behöver en SQL sats som ger namnet på de bolag som har en anställd där det överhuvudtaget finns en anställd för någon av bolagen. I detta fall har Nokia och Kotipizza det.

Menar du att du vill ha ut alla företag som har anställda i samtliga städer (där det bor anställda)? Dvs du vill inte ha företag som ex. bara har anställda i en eller två städer?

Isåfall kanske nåt sånt här:

Kod:
select company_name from works w
inner join employee e on w.employee_name = e.employee_name
group by company_name
having count(distinct city) = (select count(distinct city) from employee)
Citera
2010-02-24, 03:30
  #12
Medlem
Citat:
Ursprungligen postat av desmodus
Menar du att du vill ha ut alla företag som har anställda i samtliga städer (där det bor anställda)? Dvs du vill inte ha företag som ex. bara har anställda i en eller två städer?

Isåfall kanske nåt sånt här:

Kod:
select company_name from works w
inner join employee e on w.employee_name = e.employee_name
group by company_name
having count(distinct city) = (select count(distinct city) from employee)

Tack! vart det jag vart ute efter. Vet inte fan hur jag inte kom att tänka på att använda HAVING fastän jag nyss använde det till ett annat problem
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