Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 из двух таблиц выбрать данные, которых нет в таблице-связке  [new]
MishaMW
Member

Откуда: Санкт-Петербург
Сообщений: 21
 CREATE TABLE #A(aID int IDENTITY (1, 1) NOT NULL , aName varchar(10)) 
  INSERT #A(aName) values('СТ1') 
  INSERT #A(aName) values('СТ2') 
  CREATE TABLE #B(bID int IDENTITY (1, 1) NOT NULL , bName varchar(10)) 
  INSERT #B(bName) values('mask1') 
  INSERT #B(bName) values('mask2') 
  INSERT #B(bName) values('mask3') 
  INSERT #B(bName) values('mask4') 
  INSERT #B(bName) values('mask5') 

--Таблица-связка
  CREATE TABLE #C(aID int NOT NULL , bID int NOT NULL) 
  INSERT #C(aID, bID) values(1,1) 
  INSERT #C(aID, bID) values(1,2) 
  INSERT #C(aID, bID) values(1,5) 
  INSERT #C(aID, bID) values(2,2) 
  INSERT #C(aID, bID) values(2,3) 
  INSERT #C(aID, bID) values(2,4) 
  INSERT #C(aID, bID) values(2,5)

Результат:
AName BName
СТ1mask3
СТ1mask4
СТ2mask1


Делаю с помощью курсора, но это очень долго
DECLARE @t TABLE(AName varchar(10), BName varchar(10))

DECLARE @aID int
DECLARE @aName varchar(10)
DECLARE curEx CURSOR FOR 
	SELECT aID, aName FROM #A ;

OPEN curEx
FETCH NEXT FROM curEx INTO @aID, @aName
WHILE (@@FETCH_STATUS <> -1) 
BEGIN
	IF  (@@FETCH_STATUS <> -2)
	BEGIN
		INSERT INTO @t
		SELECT @aName, bName FROM #B WHERE bId NOT IN
		(
			SELECT #B.bId 
			FROM #A 
			INNER JOIN #C ON #C.aID = #A.aID
			INNER JOIN #B ON #B.bID = #C.bID
			WHERE #A.aID = @aID
		) 
	END
FETCH NEXT FROM curEx INTO @aID, @aName
END
CLOSE curEx
DEALLOCATE curEx

DROP TABLE #A
DROP TABLE #B
DROP TABLE #C
SELECT * FROM @t

Microsoft SQL Server 2000 - 8.00.2055 (Intel X86) Dec 16 2008 19:46:53 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
17 дек 09, 11:58    [8079566]     Ответить | Цитировать Сообщить модератору
 Re: из двух таблиц выбрать данные, которых нет в таблице-связке  [new]
Леша777
Guest
SELECT a.aID, b.bID
FROM #A a
CROSS JOIN #B b
WHERE NOT EXISTS 
                           (
                             SELECT *
                             FROM #C c
                             WHERE c.aID = a.aID
                                AND 
                                       c.bID  = b.bID 
                             
                           )

Или LEFT JOIN + IS NULL
17 дек 09, 12:03    [8079612]     Ответить | Цитировать Сообщить модератору
 Re: из двух таблиц выбрать данные, которых нет в таблице-связке  [new]
MishaMW
Member

Откуда: Санкт-Петербург
Сообщений: 21
Леша777,

Спасибо, все отлично.

Вариант LEFT JOIN + IS NULL первый пришел в голову, но он ведь показывает только данные из одной таблицы
17 дек 09, 14:27    [8080750]     Ответить | Цитировать Сообщить модератору
 Re: из двух таблиц выбрать данные, которых нет в таблице-связке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
MishaMW
Леша777,

Спасибо, все отлично.

Вариант LEFT JOIN + IS NULL первый пришел в голову, но он ведь показывает только данные из одной таблицы
А FULL JOIN не рассматривался?
17 дек 09, 14:39    [8080873]     Ответить | Цитировать Сообщить модератору
 Re: из двух таблиц выбрать данные, которых нет в таблице-связке  [new]
MishaMW
Member

Откуда: Санкт-Петербург
Сообщений: 21
iap,
Не пойму, этот код ничего не выдает

SELECT #A.aName, #B.bName
FROM #A 
	INNER JOIN #C ON #C.aID = #A.aID
	FULL JOIN #B ON #B.bID = #C.bID
	WHERE #A.aName IS NULL
17 дек 09, 17:45    [8082560]     Ответить | Цитировать Сообщить модератору
 Re: из двух таблиц выбрать данные, которых нет в таблице-связке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Не заметил, что вопрос про три таблицы.
А так не работает?
SELECT a.aID, b.bID
FROM #A a CROSS JOIN #B b
LEFT JOIN #C c ON a.aID=c.aID AND b.bID=c.bID
WHERE c.aID IS NULL;
Это если нужны все комбинации a.aID и b.bID, для которых нет связки в c.
Но кажется мне, что NOT EXISTS лучше.
17 дек 09, 17:55    [8082655]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить