Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
Всем здравствуйте.
Есть такой запрос:
SELECT * FROM Table1 T1
	INNER JOIN Table2 T2
	ON T1.ID_Prj = T2.ID_Prj AND T1.ID_Stage < T2.ID_Stage
	WHERE T1.ID_Prj = 5 AND T2.Conditions = 8
Соответственно получу все записи, удовлетворяющие заданному условию. При выборке из таблицы Table2 значений T2.Id_Stage может попасться поле Conditions = 3. Как мне это исключить?
	WHERE T1.ID_Prj = 5 AND (T2.Conditions = 8 AND T2.Conditions <> 3) 
такая ересь, конечно, делает не то. Написал только для наглядности.
Спасибо
17 фев 06, 10:33    [2366111]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31632
Kezya
При выборке из таблицы Table2 значений T2.Id_Stage может попасться поле Conditions = 3. Как мне это исключить?
Как может попасться, если у вас явно написано условие T2.Conditions = 8? Вроде 8<>3? (арифметику давно не повторял)
17 фев 06, 10:38    [2366135]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
WHERE T1.ID_Prj = 5 AND T2.Conditions <> 3
17 фев 06, 10:39    [2366140]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
При выборке из таблицы Table2 значений T2.Id_Stage может попасться поле Conditions = 3. Как мне это исключить?


Эээ... А разве это условие "T2.Conditions = 8" не исключает его?!
17 фев 06, 10:39    [2366142]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
Немного не так объяснил, прошу прощения.
В запросе из таблицы Table2 выбирется запись, у которой значение ID_Stage удовлетворяет условию ID_Prj=5 и Conditions=8. Потом из таблицы Table1 будут выбираться записи, для которых ID_Prj=5 и ID_Stage < полученного значения из таблицы Table2.
Когда идет выборка из T1, для значения T1.ID_Stage в таблице Table2 будут попадаться изначения в поле Conditioons <> 8. Мне надо исключить оттуда 3.
Поэтому вариант tpg:
WHERE T1.ID_Prj = 5 AND T2.Conditions <> 3
мне не подходит.
Table1
ID_Prj ID_Stage
5 1
5 2
5 3
5 4
5 5

Table2
ID_Prj ID_Stage Conditions
5 1 2
5 2 3
5 3 7
5 4 8
5 5 9

Выборка должна иметь следующий вид:
ID_Prj ID_Stage Conditions
5 1 2
5 4 7
Можно это сделать без под вложенного запроса, только join'ми?
17 фев 06, 10:50    [2366193]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Zioma
Member

Откуда: Украина, Киев
Сообщений: 361
А разве T2.Conditions = 8 не нужно ставить в конструкцию INNER JOIN ?
SELECT * FROM Table1 T1
	INNER JOIN Table2 T2
	ON T1.ID_Prj = T2.ID_Prj AND T1.ID_Stage < T2.ID_Stage AND T2.Conditions = 8
	WHERE T1.ID_Prj = 5
17 фев 06, 11:04    [2366257]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение прав доступа - стандартная или свое сделать  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
Можно и так, все равно объединение исключающее.
Но это не помогает :)
17 фев 06, 11:11    [2366306]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Glushkoff
Member

Откуда:
Сообщений: 405
напиши порусски что нужно сделать я те запрос напишу
а то я чтото не догоняю пока смысл твоей задачи и почему у тя не работает
17 фев 06, 11:16    [2366343]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
Немного не так объяснил, прошу прощения.
В запросе из таблицы Table2 выбирется запись, у которой значение ID_Stage удовлетворяет условию ID_Prj=5 и Conditions=8. Потом из таблицы Table1 будут выбираться записи, для которых ID_Prj=5 и ID_Stage < полученного значения из таблицы Table2.
Когда идет выборка из T1, для значения T1.ID_Stage в таблице Table2 будут попадаться изначения в поле Conditioons <> 8. Мне надо исключить оттуда 3.


Помоему, опять не так объяснили. Как при условии "у которой значение ID_Stage удовлетворяет условию ID_Prj=5 и Conditions=8" в выборку попадут попадаться изначения в поле Conditioons <> 8?!

Сформулируйте мысл еще раз, ибо из результатов, которые Вы хотите получить непонятен алгоритм обработки.
17 фев 06, 11:16    [2366346]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
USE Northwind
GO
CREATE TABLE Table1 (ID int IDENTITY(1, 1) PRIMARY KEY , ID_Prj int, ID_Stage int)
CREATE TABLE Table2 (ID int IDENTITY(1, 1) PRIMARY KEY , ID_Prj int, ID_Stage int, Condition int)

INSERT INTO Table1 VALUES(5, 1)
INSERT INTO Table1 VALUES(5, 2)
INSERT INTO Table1 VALUES(5, 3)
INSERT INTO Table1 VALUES(5, 4)
INSERT INTO Table1 VALUES(5, 5)
INSERT INTO Table1 VALUES(5, 6)
INSERT INTO Table1 VALUES(5, 7)
INSERT INTO Table1 VALUES(5, 8)


INSERT INTO Table2 VALUES(5, 1, 2)
INSERT INTO Table2 VALUES(5, 2, 3)
INSERT INTO Table2 VALUES(5, 2, 3)
INSERT INTO Table2 VALUES(5, 3, 5)
INSERT INTO Table2 VALUES(5, 4, 6)
INSERT INTO Table2 VALUES(5, 5, 7)
INSERT INTO Table2 VALUES(5, 7, 8)
INSERT INTO Table2 VALUES(5, 8, 9)
INSERT INTO Table2 VALUES(5, 9, 10)
Вот запрос:
SELECT T1.ID, T1.ID_Stage FROM Table1 T1
	INNER JOIN Table2 T2
	ON T1.ID_Prj = T2.ID_Prj AND T1.ID_Stage < T2.ID_Stage
	WHERE T1.ID_Prj = 5 AND T2.Condition = 7

Вот таким получается результат:
ID_Prj ID_Stage
1 1
2 2
3 3
4 4

Для условия:
T2.ID_Prj = 5 AND T2.Condition = 7 выбирается значение T2.ID_Stage = 5.
Для значения T2.ID_Prj = 5 AND T2.Condition = 3 выбирается значение T2.ID_Stage = 2. Вот и надо из получившейся выборки эт оисключить. Т.е. результат должен быть таким:
ID_Prj ID_Stage
1 1
2 2 <- Это значение надо исключить!
3 3
4 4
17 фев 06, 11:28    [2366437]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
SVP
Member

Откуда: Moscow
Сообщений: 147
Ваш запрос возвращает:

5 1 5 4 8
5 2 5 4 8
5 3 5 4 8

т.е. кроме Conditions = 8, ничего не вернет.
17 фев 06, 11:28    [2366443]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
SVP
Member

Откуда: Moscow
Сообщений: 147
К тому же, результат

ID_Prj ID_Stage Conditions
5 1 2
5 4 7

не получится в любом случае, т.к. даже без where

SELECT * FROM @tbl1 T1
	INNER JOIN @tbl2 T2
	ON T1.ID_Prj = T2.ID_Prj AND T1.ID_Stage < T2.ID_Stage

результат не содержит 5 1 2.
17 фев 06, 11:32    [2366485]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Glushkoff
Member

Откуда:
Сообщений: 405
похоже автор топика сам обрабатывает свои запросы в голове
17 фев 06, 11:37    [2366519]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Вы вообще проверяете, то что постите в форум?! Куча ошибок в скрипте! Откуда тогла "результат запроса" у Вас взялся?! Ничего не понял...

автор
Для условия:
T2.ID_Prj = 5 AND T2.Condition = 7 выбирается значение T2.ID_Stage = 5.
Для значения T2.ID_Prj = 5 AND T2.Condition = 3 выбирается значение T2.ID_Stage = 2.


Не надо нам "для услови"!!! Напишите, как объединить таблицы и как отфильтровать результат. ФСЕ!!!
17 фев 06, 11:37    [2366530]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
SVP
Member

Откуда: Moscow
Сообщений: 147
Кажется, понятно, что вам нужно - вы хотите из результата

1 1
2 2
3 3
4 4

выкинуть ID_Stage, у которых Conditions = 3
17 фев 06, 11:41    [2366557]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
SVP
Кажется, понятно, что вам нужно - вы хотите из результата

1 1
2 2
3 3
4 4

выкинуть ID_Stage, у которых Conditions = 3

Именно!
17 фев 06, 11:43    [2366562]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
pkarklin
Вы вообще проверяете, то что постите в форум?! Куча ошибок в скрипте!

У меня скрипт работает, не проверил бы - не написал :(
17 фев 06, 11:43    [2366571]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Glushkoff
Member

Откуда:
Сообщений: 405
Kezya
SVP
Кажется, понятно, что вам нужно - вы хотите из результата

1 1
2 2
3 3
4 4

выкинуть ID_Stage, у которых Conditions = 3

Именно!


ну так исключите напишите <> 3 и все
17 фев 06, 11:45    [2366581]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
SVP
Member

Откуда: Moscow
Сообщений: 147
Один из вариантов:

SELECT T1.ID, T1.ID_Stage
FROM @Table1 T1
INNER JOIN @Table2 T2 ON T1.ID_Prj = T2.ID_Prj AND T1.ID_Stage < T2.ID_Stage
WHERE T1.ID_Prj = 5 AND T2.Condition = 7
and T1.ID_Stage not in (
	select distinct t21.ID_Stage
	from @Table2 t21
	where t21.Condition = 3)

А почему вы хотите без подзапроса?
17 фев 06, 11:45    [2366582]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Kezya
pkarklin
Вы вообще проверяете, то что постите в форум?! Куча ошибок в скрипте!

У меня скрипт работает, не проверил бы - не написал :(


Да, сорри. Я взял структуру от предудущего Вашего поста, а запросы на вставку и выборку из последнего. А между этими постами Вы поменяли имена полей.
17 фев 06, 11:48    [2366600]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
SVP: Ваш запрос возвращает именно то, что нужно :)
С NOT IN я уже делал, но хочется джоином.
17 фев 06, 11:48    [2366601]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
SVP
Member

Откуда: Moscow
Сообщений: 147
Без подзапроса:

SELECT T1.ID, T1.ID_Stage
FROM @Table1 T1
INNER JOIN @Table2 T2 ON T1.ID_Prj = T2.ID_Prj AND T1.ID_Stage < T2.ID_Stage
INNER JOIN @Table2 T3 ON T1.ID_Prj = T3.ID_Prj AND T1.ID_Stage = T3.ID_Stage
WHERE T1.ID_Prj = 5 AND T2.Condition = 7 and T3.Condition <> 3
17 фев 06, 11:49    [2366612]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kezya
С NOT IN я уже делал, но хочется джоином.
А почему не хочется с NOT EXISTS ?
17 фев 06, 11:50    [2366616]     Ответить | Цитировать Сообщить модератору
 Re: Разграничение прав доступа - стандартная или свое сделать  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
SVP: работает, спасибо большое!
17 фев 06, 11:55    [2366637]     Ответить | Цитировать Сообщить модератору
 Re: Как-бы заменить IN(...) JOIN'ми ?  [new]
Kezya
Member

Откуда: Н-ск
Сообщений: 349
tpg
Kezya
С NOT IN я уже делал, но хочется джоином.
А почему не хочется с NOT EXISTS ?

хм, а как с NOT EXISTS?
17 фев 06, 11:55    [2366642]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить