FAQ |
Kalender |
2009-07-08, 15:45 | #1 | |||
|
||||
Flitig postare
|
Hej!
Jag har två tabeller(väsentligen sparade queries) i access, jag söker en(eller flera i kombination) fråga(or) där jag får ut de PID som har CID i tabell två som matchar alla CID i tabell 1. Tabell 1 ser ut som såhär: CID 1 4 5 Tabell 2 ser ut såhär: PID CID 7 4 7 1 7 5 7 1 8 5 8 1 19 4 19 1 23 4 23 1 28 1 29 1 31 1 Det jag vill är alltså att få ut värdet 7 i PID(personID), detta eftersom det är den enda som representeras i alla relevanta konferenser(CID) Jag försöker få till en intersect mellan CID och CID men att samtidigt få ut PID.. får det inte att fungera. I mitt huvud borde följande SQL fungera, men det gör det inte. Kod:
SELECT CID FROM [tabell1] INTERSECT SELECT * FROM [tabell2] |
|||
Svara med citat |
2009-07-08, 17:21 | #2 | ||
|
|||
Bara ett inlägg till!
|
LEFT JOIN?
Kod:
SELECT tabell1.* tabell2.* FROM tabell1 LEFT JOIN tabell2 ON tabell1.CID=tabell2.CID |
||
Svara med citat |
2009-07-08, 17:36 | #3 | ||
|
|||
Nykomling
|
WHERE EXIST() eller WHERE NOT EXIST() då?
|
||
Svara med citat |
2009-07-09, 02:35 | #4 | ||
|
|||
Klarade millennium-buggen
|
Korrekt svar är:
Kod:
SELECT pid, cid FROM tabell2 WHERE cid IN (SELECT cid FROM tabell1) |
||
Svara med citat |
2009-07-09, 23:40 | #5 | |||
|
||||
Flitig postare
|
Tack allihopa, men tyvärr är alla era svar fel, för jag vill inte ha en resultatrad om "någon" är matchad, utan bara om "alla" är matchade.
i ovan nämnda fall är tabell 1 "SQL-fråga 8 -delfråga 1" o.s.v. Det vart ganska komplicerat till slut... Huvudfråga Kod:
SELECT PID FROM [SQL-fråga 8 -delfråga 5], [SQL-fråga 8 -delfråga 4] WHERE [SQL-fråga 8 -delfråga 5].count=[SQL-fråga 8 -delfråga 4].count; Kod:
SELECT Conference.ID AS CID FROM Conference, Ämne, ÄmneConference WHERE Conference.ID=ÄmneConference.Conference And ÄmneConference.Ämne=Ämne.ID And Ämne.Namn='XML' GROUP BY Conference.ID; Kod:
SELECT Författare.PID, Session.Conference AS CID FROM Författare, Paper, Klassificering, Ämne, Presentation, [Session], Conference WHERE Författare.Paper=Paper.ID AND Paper.Klassificering=Klassificering.ID AND Klassificering.Namn='Accepted' AND Paper.Ämne=Ämne.ID AND Ämne.namn='XML' AND Paper.ID=Presentation.PaperID AND Presentation.Session=Session.ID; Kod:
SELECT DISTINCT CID AS dCID, PID FROM [SQL-fråga 8 -delfråga 2]; Kod:
SELECT Count(dCID) AS [count], PID FROM (SELECT * FROM [SQL-fråga 8 -delfråga 3]) AS [%$##@_Alias] GROUP BY PID; Kod:
SELECT Count(CID) AS [count] FROM (SELECT * FROM [SQL-fråga 8 -delfråga 1]) AS [%$##@_Alias]; |
|||
Svara med citat |
2009-07-10, 01:20 | #6 | ||
|
|||
Klarade millennium-buggen
|
Är det här bättre (Testkört i Access 2007 och ger enbart 1 tuppel med värdet 7)?
Kod:
SELECT pid FROM (SELECT pid, count(*) as antal FROM Tabell2 group by pid) where antal=(select count(*) from tabell1); Även detta är löst med en enkel sub-select som vi lägger i FROM-klausulen så att vi skapar en "virtuell" tabell, vill man kan man hitta på ett alias för den men det var inte nödvändigt i detta relativt enkla fall. Sub-selecten i WHERE-klausulen är bara till för att räkna raderna i tabell1. Jag har förutsatt att PID och CID är delar av primärnyckeln i tabell2 (är detta riktigt?) för då är exemplet med data fel. |
||
Svara med citat |
Svara |
|
|