No Join Predicate с указанным неправильным столбцом [duplicate]

Вы можете расширить класс и тег Application для любых объектов, которые вы там хотите, затем они доступны в любом месте вашего приложения

10
задан Martin Smith 8 May 2011 в 12:56
поделиться

2 ответа

Он принимает значение hs_id из внешнего запроса.

Неквалифицированные ссылки столбцов разрешаются из ближайшей области наружу, поэтому это просто рассматривается как коррелированный подзапрос.

Результатом этого запроса будет удаление всех строк из Photo, где hs_id не является нулевым, если у HotelSupplier есть хотя бы одна строка, где id = 142 (и поэтому подзапрос возвращает хотя бы одна строка)

Возможно, это будет немного яснее, если вы считаете, каков эффект этого

delete from Photo  where Photo.hs_id  in (select Photo.hs_id)

Это, конечно, эквивалентно

delete from Photo where Photo.hs_id = Photo.hs_id

Кстати, это далеко и далеко самая распространенная «ошибка», которую я лично видел ошибочно в Microsoft Connect. Erland Sommarskog включает его в свой список желаний для SET STRICT_CHECKS ON

21
ответ дан Martin Smith 19 August 2018 в 16:47
поделиться
  • 1
    +1 - Просто хотел явно указать хорошую практику в вашем примере - включая имена таблиц для каждого из столбцов (два идентификатора части) во всем вашем запросе. Хорошая практика в целом, бесценная практика в заявлениях об удалении! – Chris Shaffer 4 January 2011 в 15:50
  • 2
    Спасибо, я этого не знал. imho странно, что (в вашей упрощенной версии также) notn-существующий «select Photo.hs_id» не генерирует ошибку – Michel 4 January 2011 в 16:39
  • 3
    @Michel - Это не существует. Он рассматривается как коррелированный подзапрос и оценивается для каждой строки, используя значение, переданное из внешнего запроса. – Martin Smith 4 January 2011 в 16:43

Это сильный аргумент для сохранения совпадений столбцов между таблицами. Как говорит @Martin, синтаксис SQL позволяет разрешать имена столбцов из внешнего запроса, если во внутреннем запросе нет совпадений. Это является благом при написании коррелированных подзапросов, но иногда может иногда вас трогать (как здесь)

1
ответ дан Damien_The_Unbeliever 19 August 2018 в 16:47
поделиться
  • 1
    да, абсолютно согласен, что в этом db-состоянии находится далеко. textkey, textid, text_key, text_id, hsid, hs_id и т. д. brrrrr – Michel 4 January 2011 в 16:42
  • 2
    Конечно, это не поможет, если вы введете неправильное имя таблицы, которое не имеет права вообще – Kevin 7 September 2016 в 12:23
Другие вопросы по тегам:

Похожие вопросы: