Имя: Пароль:
IT
Админ
MS SQL Условие по условию
,
0 zenik
 
19.02.16
11:53
Помогите с запросом плз. База на MSSQL 2005.

SELECT * FROM Таблица AS A
WHERE
A.R22 IN ( SELECT ID FROM CashFR WHERE CashID = @CashID )

Как бы сделать так, что если ID FROM CashFR = NULL, то этого условия не было и из таблицы бы черпалось все. Сейчас сделано два разных запроса один с этим условием, другой без него... Хотелось оптимизировать.
1 ObjectRelation Model
 
19.02.16
11:55
так что ли?

SELECT * FROM Таблица AS A
WHERE
A.R22 IN
( SELECT ID FROM CashFR WHERE CashID = @CashID
UNION ALL
SELECT ID FROM CashFR WHERE CashID IS NULL)
2 zenik
 
19.02.16
11:58
Ну да :) Спасибо.
3 zenik
 
19.02.16
12:00
А не...
4 zenik
 
19.02.16
12:03
@CashID - у меня всегда имеет значение.
CashFR - Для каждой @CashID хранит 0,1,2

В идеале: если CashFR для @CashID = 0 - то условие на "Таблицу" не распространяется. В таблице в этом поле тоже в принципе 1 или 2 (0 в ней нет).
5 ObjectRelation Model
 
19.02.16
12:05
ничего не понял
CashFR это таблица же
6 rs_trade
 
19.02.16
12:09
Погугли динамический СКЛ. Если я все верно понял.
7 zenik
 
19.02.16
12:09
На пальцах:
Таблица
ID,R22
1|1
2|1
3|2

CashFR
ID|CashID
1|1
1|2
2|1
3|0

Для CashID = 1 Надо получить ID Таблица 1,2,3.
Для CashID = 2 Надо получить ID Таблица 1,2.
Для CashID = 3 Надо получить ID Таблица 1,2,3.
8 zenik
 
19.02.16
12:10
Поправочка
CashFR
CashID | ID
9 ObjectRelation Model
 
19.02.16
12:18
и еще 0 или NULL там?
10 zenik
 
19.02.16
12:20
(9) Да без разницы... По ситуации подстроюсь. Если с null проще - то сделаем null :)
11 zenik
 
19.02.16
12:22
т.е. Могу сделать так:
CashFR
CashID|ID
1|1
1|2
2|1
3|NULL

или так:
CashFR
CashID|ID
1|1
1|2
2|1

Результат должен остаться прежним.
12 Jonny_Khomich
 
19.02.16
12:24
Вот ты работник хороший. Решил оптимизировать на что можно глаза закрыть и потратил 2 часа, а ещё потратишь 2 часа чтобы внедрить и протестировать
13 zenik
 
19.02.16
12:27
(12) Как я уже сказал выше, сейчас это реализовано через разные процедуры. Для внесения изменений - надо править 2 процедуры... и тестировать потом тоже 2... А сейчас предстоит переделать эти две процедуры, вот и решил начать с небольшой оптимизации.
14 ObjectRelation Model
 
19.02.16
12:32
SELECT * FROM Таблица AS A
WHERE
A.R22 IN ( SELECT ID FROM CashFR WHERE CashID = @CashID )
OR @CashID IS NULL
15 trad
 
19.02.16
12:33
declare @Таблица table(ID int, R22 int)
insert into @Таблица
select 1,1 union all
select 2,1 union all
select 3,2

declare @CashFR table(CashID int, ID int)
insert into @CashFR
select 1,1 union all
select 1,2 union all
select 2,1 union all
select 3,null

declare @CashID int
set @CashID = 1

while(@CashID<=3)
begin

    SELECT A.ID
    FROM @CashFR as CashFR
    left join @Таблица AS A on A.R22 = CashFR.ID or CashFR.ID is null
    WHERE CashFR.CashID = @CashID

    set @CashID = @CashID+1
end
16 trad
 
19.02.16
12:34
ID          
-----------
1
2
3

(3 row(s) affected)

ID          
-----------
1
2

(2 row(s) affected)

ID          
-----------
1
2
3

(3 row(s) affected)
17 zenik
 
19.02.16
12:43
(15) Спасибо, я идею понял... Но запрос сложнее намного, и так кардинально его переделывать не хотелось бы
(14) Спасибо. Вроде что то близкое. Попробую доделать под задачу.
18 trad
 
19.02.16
12:48
(17) видимо не понял
сам запрос
SELECT A.ID
    FROM @CashFR as CashFR
    left join @Таблица AS A on A.R22 = CashFR.ID or CashFR.ID is null
    WHERE CashFR.CashID = @CashID

остальное обвязка для теста
19 zenik
 
19.02.16
13:04
(18) да не я все понял... В начале у тебя заполнение тестовых данных. :) В принципе у меня получается через OR в скобках. Спасибо.