Nano Hash - криптовалюты, майнинг, программирование

SQL Server 2012, ЛЕВОЕ СОЕДИНЕНИЕ становится ВНУТРЕННИМ СОЕДИНЕНИЕМ

У меня есть таблицы fact и budget, в таблице budget нет значений для каждой категории

Category   Budget
A           100
B            50

C не имеет записи в budget

Похоже, что запрос превращается во внутреннее соединение в SQL Server 2012. В моем текущем местоположении я использовал тот же синтаксис в SQL Server 2005, и там он по-прежнему возвращает все записи.

Не могу проверить SQL Server 2008 прямо сейчас.

SELECT distinct Category
FROM FactRide 
LEFT OUTER JOIN
   Budget ON FactRide.Category = Budget.Category
WHERE 
   (Budget.BudgetType = 'Ride' OR Budget.BudgetType IS NULL)

Я пропустил изменение в SQL Server 2012?

Проблема в том, что результат не возвращает категорию C, как следует. Когда я добавляю строку в бюджет с категорией C и значением бюджета «Нуль», проблема «решена».

Но я хотел бы знать, должен ли я попросить поставщика сгенерировать другой SQL или посмотреть пакет обновления SQL 2012....


  • Приведите примеры данных, иллюстрирующие проблему. Уверяю вас, семантика соединения не изменилась. 20.11.2012
  • Разве это не жалобы на то, что вы не знаете, какой Category вы имеете в виду в своем select? Это может быть либо Fact.Category, либо Budget.Category. Это не настоящий запрос? 20.11.2012
  • Ваш запрос ссылается на таблицу с именем Fact в JOIN, но фактической таблицы Fact (или псевдонима) в FROM нет. Я тоже согласна с Рене. Чтобы избежать путаницы, убедитесь, что SELECT указывает, из какой таблицы должен быть взят столбец Category. 20.11.2012
  • Да, это не оригинальный запрос, я исправил пример запроса. Исходный запрос просто имеет больше имен, специфичных для культуры... я попытался упростить его. 20.11.2012
  • Можете ли вы настроить sqlfiddle.com/#!6/2df66/5, чтобы показать проблему ? 20.11.2012
  • Ваше внешнее соединение и WHERE исключат те, у которых есть совпадающая строка, но для которых BudgetType не является ни Ride, ни NULL. Это одна и та же семантика во всех версиях SQL Server. 20.11.2012
  • @Laurence - я полагаю, что OP ожидает, что в этом случае будет возвращено B (а это не так). Для этого им нужно LEFT OUTER JOIN Budget ON FactRide.Category = Budget.Category and Budget.BudgetType = 'Ride'. Должно быть тестирование на разных данных. 20.11.2012
  • @MartinSmith Я думаю, что OP упростил запрос до такой степени, что он не показывает проблему. Он явно жалуется на отсутствие буквы «С». Либо это, либо он получает другие результаты локально, чем скрипка. 20.11.2012
  • @Laurence, ожидаемый результат с вашими данными - A, C. 20.11.2012
  • @Laurence - Но в их реальных данных C, вероятно, совпадает с B в вашей демонстрации. В том, что у него есть соответствующая строка для соединения, но значение BudgetType не равно ни «Ride», ни NULL, поэтому оно исключается WHERE. Я думаю, что они (неправильно) ожидают, что все значения из FactRide будут сохранены. 20.11.2012
  • @MartinSmith From OP C не имеет записи в бюджете. Когда я добавляю строку в бюджет с категорией C и бюджетом Null, проблема решается. Хотя я согласен, что одно из этих предположений окажется ложным на тесте 2012 года. 20.11.2012
  • @Laurence - они, вероятно, ошибаются в том, что у C нет рекорда в бюджете. Поведение было бы объяснено, если бы была запись в бюджете для C, но BudgetType не является "Поездкой" или NULL. 20.11.2012
  • Чтобы было ясно, это не проблема с SQL Server 2012. Поведение соединения запроса в этой версии такое же. 20.11.2012
  • Я ожидал, что первый запрос будет вести себя как второй: sqlfiddle.com/#!6/2df66 /27/1 , запрос генерируется из приложения, поэтому единственное, что я могу сделать, это заставить его генерировать первым. Я решил это так же, как упоминалось ранее, просто добавив пустые записи бюджета для категории. 07.12.2012

Ответы:


1

Да, синтаксис присоединения к SQL Server изменился по сравнению с SQL Server 2012, и это застало меня врасплох. Полную информацию можно найти по адресу: https://straightpathsql.com/archives/2012/11/sql-server-join-syntax-its/

22.11.2017
  • Эта статья не имеет ничего общего с исходным вопросом. OP использует «новый» синтаксис соединения, и он доступен (как минимум) с SQL Server 2000. 22.11.2017
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..