Выберите из вида - неожиданные побочные эффекты - PullRequest
0 голосов
/ 17 сентября 2009

Я столкнулся со странным запросом, встроенным в приложение (да, отлично!):

SELECT PersonId
    , Salutation
    , Email
    , Postcode
FROM    vw_NewsletterSubscriptions
WHERE    PersonId IN (SELECT PersonId FROM vw_NewsletterSubscriptions) 
    AND NewsletterTypeID=1 
    AND UnSubscribeDate Is NULL
GROUP BY PersonId
    , Salutation
    , Email
    , Postcode

Я выбрал именно SELECT в предложении WHERE. Казалось, он говорит «выберите некоторые данные из этого представления, где данные находятся в представлении», что немного ненужно. Поэтому я закомментировал эту строку в предложении WHERE:

SELECT PersonId
    , Salutation
    , Email
    , Postcode
FROM    vw_NewsletterSubscriptions
WHERE    NewsletterTypeID=1 
    AND UnSubscribeDate Is NULL
GROUP BY PersonId
    , Salutation
    , Email
    , Postcode

Для полноты я запустил обе версии, чтобы убедиться, что они идентичны, а они нет. Новая версия возвращает больше строк - строк, которых не было в первой версии. Я соединил два набора, чтобы увидеть разницу, но в дополнительных строках нет ничего очевидного.

Я явно что-то здесь упускаю. Не могли бы вы объяснить, что происходит, пожалуйста?

Ответы [ 5 ]

2 голосов
/ 17 сентября 2009

Есть ли строки с NULL в PersonID - в первом запросе будет отфильтровано предложение IN, а во втором нет ничего, поэтому объясним второй запрос, возвращающий больше строк.

Может быть полезно, если вы можете опубликовать некоторые образцы данных (с именами и другими идентифицирующими данными, спрятанными для защиты предполагаемого невиновного) - образцы строк, которые появляются только в одном, и строки, которые появляются в обоих.

(также этот вопрос лучше подходит для StackOverflow)

0 голосов
/ 30 октября 2009

Спасибо за все идеи, ребята. Я сравнил результаты запроса с и без, казалось бы, ненужного предложения, и, черт побери, могу увидеть шаблон. Представление было слишком сложным, поэтому я реорганизовал его, и теперь я получаю одинаковое количество строк в любом случае. Плюс количество подписчиков на нашу рассылку тоже увеличилось!

0 голосов
/ 23 сентября 2009
PersonId IN (SELECT PersonId FROM vw_NewsletterSubscriptions)

означает

PersonId IS NOT NULL

Вы можете добавить это условие к вашему запросу

0 голосов
/ 23 сентября 2009

Я предполагаю, что это ms sql server (я вижу тег sql-server), но если это не так, пожалуйста, уточните. Я проверил это с 750 фальшивых строк, которые я вставил в базу данных. все мои данные были хорошими (без нуля там, где их не должно быть), и я не смог воспроизвести вашу проблему. Я должен предположить, что это какая-то проблема с данными. Я не вижу, как можно решить проблему, не видя данных. Одна вещь, которую вы, возможно, захотите попробовать, - это сброс данных из представления в обычную таблицу (только указанные поля). было бы интересно посмотреть, не сработали ли запросы к обычной таблице. также, если вы ограничитесь только 5 или 6 ссылочными полями, что-то может выпасть на вас.

-don

0 голосов
/ 17 сентября 2009

Если значения NULL не являются проблемой (как предположил Дэвид Спиллетт), то лучшая стратегия состоит в том, чтобы начать детально смотреть на , который строк включен в одну, а не в другую, и посмотреть, сможете ли вы выяснить, что отличает их.

Если это не поможет, вам придется начать копаться в определении базового представления и посмотреть, дает ли это какие-либо подсказки. Представления могут содержать сложные объединения, фильтры, UNIONS, триггеры и другие сумасшедшие вещи, которые мешают здесь.

Если представление достаточно простое, попробуйте сконструировать этот запрос, ссылаясь на базовые таблицы, а не ... посмотрите, получите ли вы то же странное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...