ahmed_sa Ответов: 2

Как написать это утверждение с помощью join без использования (не в) statment ?


How to write this statement by using join without using (not in) statement ?


Я работаю на SQL server 2012

Мне нужно использовать альтернативный оператор запроса, чтобы (не в)

использование только условий join и where

Возможно это или нет ?

Что я уже пробовал:

SELECT PartID, SupplierId
FROM #parts 
WHERE PartID NOT IN (
	SELECT t.PartID
	FROM #tempsupplier AS s
	INNER JOIN #TradeCodes AS t ON t.TradeCode = s.TradeCode
);


Подробности Если вам нужно
create table #tempsupplier
(
SupplierId  int,
TradeCode  int
)
insert into #tempsupplier(SupplierId,TradeCode) 
values 
(10,15)

create table #parts
(
PartID  int,
PartNumber  nvarchar(200),
SupplierId int,
TradeCode int
)

insert into #parts
(PartID,PartNumber,SupplierId) 
values
(100,'silicon',10),
(200,'motherboard',10),
(300,'iron',10),
(400,'plastic',10),



create table #TradeCodes
(
PartID int,
TradeCode int
)
insert into #TradeCodes
(PartID,TradeCode) 
values
(300,15),
(400,15)

FinalResult

partid  companyid  

100       10
200       10

MadMyche

Что плохого в использовании NOT IN?

dnibbo

Я не думаю, что есть что-то неправильное в том, что у вас есть, если я правильно читаю это. Не в том, что это совершенно нормально.
Вы пытаетесь найти все "части", которые не имеют торгового кода?

Вы могли бы использовать

SELECT p.PartID, p.SupplierID
    FROM #parts p
    LEFT OUTER JOIN #TradeCodes t ON t.PartID = p.PartID
    WHERE t.TradeCode IS NULL

ahmed_sa

спасибо за ответ
заявление я пишу (не в)
дайте мне правильный результат
но мне нужно использовать join with where если есть условие
возможно это или нет

2 Ответов

Рейтинг:
12

MadMyche

Есть несколько способов добиться этого.

Вот ваш исходный запрос, а также две другие версии, основанные на запросе, который вы предоставили (на основе того, что я написал день назад).

SELECT PartID, SupplierId
FROM #parts 
WHERE PartID NOT IN (
	SELECT t.PartID
	FROM #tempsupplier AS s
	INNER JOIN #TradeCodes AS t ON t.TradeCode = s.TradeCode
);

SELECT p.PartID, p.SupplierId
FROM   #parts                 p
LEFT OUTER JOIN #TradeCodes   t ON p.PartID = t.PartID
LEFT OUTER JOIN #tempsupplier s ON t.TradeCode = s.TradeCode
WHERE t.PartID is  NULL

SELECT p.PartID, p.SupplierId
FROM   #parts      p
LEFT OUTER JOIN (
     SELECT t.PartID
     FROM   #tempsupplier   AS s
     INNER JOIN #TradeCodes AS t ON t.TradeCode = s.TradeCode
) x ON p.PartID = x.PartID
WHERE x.PartID is  NULL
Я повторю, что вам нужно правильно использовать инструменты (SSMS => показать фактический план выполнения), чтобы увидеть, какой из них наиболее эффективен. Первые 2 запроса равны по производительности, в то время как соединение с подзапросом гораздо менее эффективно.


ahmed_sa

Большое спасибо!

Wendelius

Хорошее решение

Рейтинг:
1

Wendelius

Событие хотя это уже помечено как ответ просто для того чтобы дать еще одну альтернативу NOT IN структура.

Хотя NOT IN часто является выполнимым выбором, он может привести к проблемам с производительностью или даже ошибкам во время выполнения, если список in велик. Чтобы избежать этого, один из способов-преобразовать NOT IN условие к коррелированному NOT EXISTS состояние.

Рассмотрим следующий пример

SELECT PartID, SupplierId
FROM  #parts p
WHERE NOT EXISTS (SELECT 1
                  FROM #tempsupplier  s
                  INNER JOIN #TradeCodes t ON t.TradeCode = s.TradeCode
                  WHERE t.PartID = p.PartID
);