Когда я смотрю на сложный фрагмент кода SQL, это то, что я делаю.
Во-первых, если это обновление или удаление, я добавляю код (если его там нет и он закомментирован), чтобы сделать его выбором. Никогда не пытайтесь обновить или удалить в первый раз, не увидев результаты сначала. Если это обновление, я проверяю, что выбор показывает текущее значение и то, что я буду устанавливать для него, чтобы убедиться, что я получаю желаемый результат.
Понимание объединений имеет решающее значение для понимания сложного SQL. Для каждого присоединения я спрашиваю себя, почему это здесь? Есть четыре основных причины. Вам нужен столбец для выбора, вам нужно поле для предложения where, вам нужно объединение в качестве моста к третьей таблице, или вам нужно присоединиться к таблице для фильтрации записей (например, для получения сведений о клиенте, у которого есть заказы). но не нуждаясь в деталях заказа, это часто может быть сделано лучше с условием IF EXISTS where). Если это левое или правое соединение (я склонен переписывать, чтобы все было левым соединением, которое упрощает жизнь.), Я думаю, сработает ли внутреннее соединение. Зачем мне нужно левое соединение? Если я не знаю ответа, я буду запускать его в обоих направлениях и увижу разницу в данных. Если есть производные таблицы, я сначала посмотрю на них (запустив только ту часть select, чтобы увидеть, каков результат), чтобы понять, почему она есть. Если есть подзапросы, я попытаюсь их понять, а если они будут медленными, вместо этого попробую преобразовать их в производную таблицу, поскольку они часто выполняются намного быстрее.
Далее я смотрю на предложения where
. Это то место, где вам пригодится прочная основа в вашей конкретной базе данных. Например, я знаю в своих базах данных, в каких случаях мне может понадобиться увидеть только почтовый адрес и в каких случаях мне может понадобиться увидеть другие адреса. Это помогает мне узнать, что-то отсутствует в предложении where. В противном случае я рассматриваю каждый пункт в предложении where
и выясняю, почему он должен быть там, а затем я думаю, есть ли что-то пропущенное, что должно быть там. Посмотрев его, я думаю, могу ли я внести коррективы, чтобы сделать запрос саргматичным.
Далее я также рассмотрю любые сложные биты из списка выбора. Что делает это заявление случая? Почему есть подзапрос? Что делают эти функции? (Я всегда ищу код функции для любой функции, с которой я еще не знаком.) Почему есть отличное? Можно ли избавиться от него с помощью производной таблицы или агрегатной функции и группы по операторам?
Наконец, и САМОЕ важное , я запускаю процедуру выбора и определяю, выглядят ли результаты правильно, основываясь на моих знаниях о бизнесе. Если вы не понимаете своего бизнеса, вы не узнаете, правильный ли запрос . Синтаксически правильный не означает правильных результатов. Часто в существующем пользовательском интерфейсе есть часть, которую вы можете использовать в качестве руководства для определения правильности ваших результатов. Если у меня есть экран, который показывает заказы для клиента, и я делаю отчет, который включает заказы клиентов, я мог бы провести выборочную проверку нескольких отдельных клиентов, чтобы убедиться, что они показывают правильный результат.
Если текущий запрос фильтруется некорректно, я удалю его фрагменты, чтобы узнать, как избавиться от записей, которые мне не нужны, или добавить записи, которые мне не нужны. Часто вы обнаружите, что объединение является одним ко многим, и вам нужно одно к одному (используйте производную таблицу в этом случае!) Или вы обнаружите, что некоторая часть информации, которая, по вашему мнению, вам нужна в предложении where
, не является Значение true для всех данных, которые вам нужны, или что отсутствует какой-то фрагмент предложения where
. Помогает иметь все поля в предложении where
(если они еще не были выбраны) во время выбора, когда вы это делаете. Это может даже помочь показать все поля из всех соединенных таблиц и реально посмотреть на данные. Когда я делаю это, я часто добавляю немного к предложению where, чтобы получить только некоторые записи, которые у меня есть, которых не должно быть, а не все записи.
Одной хитрой вещью, которая нарушает многие запросы, является предложение where
, ссылающееся на поле в таблице справа от левого соединения. Это превращает это во внутреннее соединение. Если вам действительно нужно левое соединение, вы должны добавить такие условия в само соединение.