WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hjälp med SQL (https://www.wn.se/forum/showthread.php?t=37798)

festiz 2009-07-08 14:45

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]

It are not working. What is wrong?

eliasson 2009-07-08 16:21

LEFT JOIN?
Kod:

SELECT tabell1.* tabell2.* FROM tabell1 LEFT JOIN tabell2 ON tabell1.CID=tabell2.CID
Är inte helt säker på att jag förstod vad du vill göra, för du har med mycket information som antagligen inte är relevant.

rikardottosson 2009-07-08 16:36

WHERE EXIST() eller WHERE NOT EXIST() då?

Conny Westh 2009-07-09 01:35

Korrekt svar är:

Kod:

SELECT pid, cid
FROM tabell2
WHERE cid IN (SELECT cid FROM tabell1)

Subselecten i WHERE satsentar fram en lista på värdena 1,4,5 och sen kommer WHERE-satsen att jämföra cid från tabell2 med denna lista och när det sker en matchning så visas värdet.

festiz 2009-07-09 22:40

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;

Delfråga 1
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;

Delfråga 2
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;

Delfråga 3
Kod:

SELECT DISTINCT CID AS dCID, PID
FROM [SQL-fråga 8 -delfråga 2];

Delfråga 4
Kod:

SELECT Count(dCID) AS [count], PID
FROM (SELECT * FROM [SQL-fråga 8 -delfråga 3]) AS [%$##@_Alias]
GROUP BY PID;

Delfråga 5
Kod:

SELECT Count(CID) AS [count]
FROM (SELECT * FROM [SQL-fråga 8 -delfråga 1]) AS [%$##@_Alias];

Om det går att göra enklare, go ahead, make my day. För jag lär mig gärna SQL bättre..

Conny Westh 2009-07-10 00:20

Ä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);

Vi grupperar alla pidarna och räknar hur många olika förekomster det finns, finns alla med borde det bli lika många som count(*) på CIDtabellen....

Ä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.


Alla tider är GMT +2. Klockan är nu 18:45.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson