Хобрук: Ваш путь к мастерству в программировании

Почему добавление предложения FROM устраняет влияние условия WHERE в подзапросе на основной запрос?

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

use [ng_data]
select distinct [disease]
from [dbo].[Final_View_2]
where [encode_id] in
(
    select [encode_id] 
    where [disease] like '%diabetes%'
)

Где encode_id — идентификатор пациента. Но этот запрос возвращает только заболевания, название которых содержит слово «диабет». Похоже, условие в подзапросе влияет на результаты в основном запросе.

Затем, когда я пытаюсь выполнить этот запрос:

use [ng_data]
select distinct [disease]
from [dbo].[Final_View_2]
where [encode_id] in
(
    select [encode_id]
    from [dbo].[Final_View_2]
    where [disease] like '%diabetes%'
)

он работает правильно. Кажется, что добавление предложения from в подзапрос может устранить влияние предложения where в подзапросе на основной запрос. Может ли кто-нибудь объяснить, как выполняются запросы и почему это дает такой результат? Меня смущает зависимость основного запроса от подзапроса.

13.10.2017

Ответы:


1

Ваш первый запрос действует как коррелированный подзапрос, т. е. строки, на которые он ссылается, поступают из набора результатов во внешнем запросе. На самом деле это просто говорит "значение столбца в этой строке похоже на '%diabetes%'"; поэтому это ничем не отличается от размещения этого предложения WHERE во внешнем запросе.

Добавляя FROM в свой подзапрос, вы создаете вторичный набор результатов encodeid, у которых есть диабет в столбце заболевания, и затем выбираете все строки, которые имеют этот encodeid в первом наборе результатов без ссылки на столбец заболевания. .

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

13.10.2017
Новые материалы

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..