Проблема в соединении таблиц - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть три таблицы с именами SData, Schdata и Fordata, и данные выглядят следующим образом:

SData:                    Schdata                     Fordata           

Name      Pro_ID          Pro_ID    Sch_ID         Str_ID    Sch_ID
ACase     258             258       438            6         654
Boece     369             125       125            7         438
Dremd     781             369       985            12        548
Wep       469             469       754            8         284


PQData

Pro_ID   Sch_ID   Type
258      438      rep
358      678      pro

Теперь я пытаюсь получить имена из SData, где в Schdata существует Pro_ID, и я не хочуPro_ID от Schdata, который имеет Shc_ID от Fordata, поэтому мой вывод должен быть:

Name    Sch_ID
Boece   985 
Wep     754

Итак, я написал запрос примерно так:

Select a.Name,s.Sch_ID 
From SData a
Inner Join Schdata s
on a.Pro_ID = s.Pro_ID
Inner Join Fordata f 
on f.Sch_ID <> s.Sch_ID

Но я не знаю,Я делаю это правильно.кто-нибудь может мне помочь?

Ответы [ 3 ]

2 голосов
/ 15 сентября 2011

Вы были почти там:

Select a.Name,s.Sch_ID 
From SData a
Inner Join Schdata s
on a.Pro_ID = s.Pro_ID
where not exists (select f.Sch_ID from Fordata f 
                  where f.Sch_ID = s.Sch_ID )
2 голосов
/ 15 сентября 2011

[См. Комментарий Мартина ниже]. Правильный способ сделать это будет:

Select a.Name,s.Sch_ID 
From SData a
Inner Join Schdata s
on a.Pro_ID = s.Pro_ID
WHERE NOT EXISTS (SELECT 1 FROM Fordata f 
WHERE f.Sch_ID = s.Sch_ID)
0 голосов
/ 15 сентября 2011

Одно решение, использующее ВНЕШНИЕ / ВНУТРЕННИЕ СОЕДИНЕНИЯ:

DECLARE @SData TABLE
(
    Name VARCHAR(25) NOT NULL
    ,Pro_ID INT NOT NULL
);
INSERT  @SData 
VALUES  ('ACase',258),('Boece',369),('Dremd',781),('Wep',469);

DECLARE @Schdata TABLE
(
    Pro_ID INT NOT NULL
    ,Sch_ID INT NOT NULL
);
INSERT  @Schdata 
VALUES  (258,438), (125,125), (369,985), (469,754);

DECLARE @Fordata TABLE
(
    Str_ID INT NOT NULL
    ,Sch_ID INT NOT NULL
);
INSERT  @Fordata
VALUES  (6,654), (7,438), (12,548), (8,284);

SELECT  a.Name, b.Sch_ID
FROM    @Schdata b
LEFT OUTER JOIN @Fordata c ON b.Sch_ID = c.Sch_ID 
INNER JOIN @SData a ON a.Pro_ID = b.Pro_ID 
WHERE   c.Sch_ID IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...