Предложение SQL where во вложенном запросе со столбцом, которого нет во вложенном запросе - PullRequest
0 голосов
/ 25 сентября 2019

Я написал следующий запрос, и он работает:

select * from processed p
inner join data d on d.dataId = p.dataid
where assetid in (select a.assetid from dbo.file f
                  inner join asset a on a.assetName = f.fileNumber
                  inner join configMapping c on c.assetId = a.assetid
                  WHERE p.id in (2,11) and rawConfig = 1)

Однако я понял, что это не должно работать.Запрос должен быть записан как:

select * from processed p
inner join data d on d.dataId = p.dataid
where assetid in (select a.assetid from dbo.file f
                  inner join asset a on a.assetName = f.fileNumber
                  inner join configMapping c on c.assetId = a.assetid
                  WHERE rawConfig = 1)
and p.id in (2,11)

Вложенный запрос ищет только ассемблиды.Кроме того, выполнение вложенного запроса само по себе не будет работать, потому что id не входит в эти три таблицы:

select a.assetid from dbo.file f
inner join asset a on a.assetName = f.fileNumber
inner join configMapping c on c.assetId = a.assetid
WHERE p.id in (2,11) and rawConfig = 1

Сообщение 207, Уровень 16, Состояние 1, Строка 44

Неверное имя столбца 'id'.

Извиняюсь за то, что не предоставил тестируемые данные для предоставления, но, по сути, вопрос в том, как вложенный запрос первого запроса использует столбец where от своего родителязапрос.Логично, что я думаю, что вложенный запрос потерпит неудачу и, следовательно, весь запрос потерпит неудачу.

Я использую новейшую версию SSMS

Ответы [ 3 ]

0 голосов
/ 25 сентября 2019

Вы должны добавить условие в выбор с помощью case Я сдвинул ContractDate, но если это не сработало, вы должны также изменить другие условия

Select
    SUM(case when c.ContractDate >= @ContractDate then c.Price else 0 end) As 'TotalPrice', 
    SUM(case when c.ContractDate >= @ContractDate then 1 else 0 end) As 'ContractCount'     
from Rsv_Contract as c
where c.RegisterUsersId = @RegisterUsersId 
    and c.contractstate in (1,2) 
    and c.ContractNumber!='0000000' 
    and c.ContractNumber!='-1'
Group by CAST(c.ContractDate AS DATE)
0 голосов
/ 25 сентября 2019

Я нашел ответ здесь:

https://docs.microsoft.com/en-us/sql/relational-databases/performance/subqueries?view=sql-server-2017

Важно

Если на столбец ссылается подзапрос, который не существует в таблице, на которую есть ссылкасогласно предложению FROM подзапроса, но существует в таблице, на которую ссылается предложение FROM внешнего запроса, запрос выполняется без ошибок.SQL Server неявно квалифицирует столбец в подзапросе с именем таблицы во внешнем запросе.

Он эффективно преобразует запрос в серию объединений перед выполнением.

0 голосов
/ 25 сентября 2019

Вы можете использовать EXISTS предложение sql.

select *
  from processed p
  join data d 
    on d.dataid = p.dataid
 where p.id in (2, 11)
   and exists (select 1
                 from dbo.file f
                 join asset a 
                   on a.assetname = f.filenumber
                 join configmapping c 
                   on c.assetid = a.assetid
                where a.assetid = p.asset_id
                  and rawconfig = 1)

Извините, ребята, я плохо не упомянул код заранее.

Надеюсь, это решит вашу проблему.

...