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

Подзапрос вернул более 1 значения с условиями Iif

select *
from employee
where controllingoffice in (
    Iif(1=1, (select id from controllingoffice), (select id from controllingoffice where OwnerId=4))
)

Сообщение 512, уровень 16, состояние 1, подзапрос строки 1 вернул более 1 значения. Это не разрешено, когда подзапрос следует за =, !=, ‹, ‹= , ›, ›= или когда подзапрос используется как выражение.

Примечание. Оба подзапроса возвращают более 1 строки.

20.10.2020

  • Проверьте это: stackoverflow.com/questions/2653188/ 20.10.2020
  • Пожалуйста, ознакомьтесь с тем, как задать правильный вопрос, и предоставьте некоторые расходные примеры данных. В любом случае, вы можете попробовать изменить запрос следующим образом: SELECT e.* FROM employee AS e INNER JOIN controllingoffice AS c ON c.id = e.controllingoffice AND c.id = CASE WHEN 1=1 THEN c.id ELSE 4 END. 20.10.2020
  • @hsn - я заметил, что вы не приняли ответ и не прокомментировали свой предыдущий вопрос. Пожалуйста, прочитайте когда кто-то ответит 20.10.2020
  • Разве второй запрос не является подмножеством первого? В любом случае вы можете просто использовать or на самом внешнем уровне или union из двух запросов. 20.10.2020
  • Подождите, поскольку 1 всегда равно 1, не будет ли IIF всегда возвращать первый аргумент? Я вообще не понимаю этот пример кода. 20.10.2020
  • Какая часть сообщения об ошибке вам непонятна? 20.10.2020
  • @hsn К вашему сведению, если вы хотите получить ответы на свои вопросы, вам нужно взаимодействовать с людьми, оставляющими комментарии. 21.10.2020
  • Ну, мой вопрос очень прост, почему подзапрос возвращает ошибку, когда используется условие case/iif 21.10.2020

Ответы:


1

Причина сбоя вашего запроса заключается в том, что ваши подзапросы возвращают несколько значений, в то время как функция iif() ожидает скалярные результаты для своих аргументов. Поскольку iif() — это функция, она возвращает одно значение, а не набор строк. Вы не можете использовать его для ветвления, как в процедурном языке, поэтому вы не можете сделать выполнение подзапросов условным в этом смысле.

Приведенный ниже подзапрос позволяет вам выразить условие движения один раз в одном месте. Это может быть удобно, если используется динамический SQL. Я предполагаю, что ваш 1 = 1 является заполнителем для этого ввода. Условие переключения определяет, будут ли возвращены все строки или только строки для одного OwnerId:

select *
from employee
where controllingoffice in (
    select id from controllingoffice where
    <switch condition> or OwnerId = 4
);

Кстати логика X or (~X)Y сводится к X or Y

Приближение к тому, что вы намеревались сделать, будет выглядеть примерно так:

select *
from employee
where
    1 = 1 and controllingoffice in (
        select id from controllingoffice
    )
 or 0 = 1 and controllingoffice in (
        select id from controllingoffice where OwnerId = 4
    );
20.10.2020
  • Я не думаю, что это правильно: насколько я понял, 1=1просто представляет собой переключатель, поэтому я предполагаю, что намерение either return all employees of all controllingoffices OR (if other switch state) return only of a selected office (in this case 4) - ваш пример вернет только всех сотрудников офиса 4 ... или я что-то здесь упустил? or не равно xor, верно? 20.10.2020
  • @ Tyron78, как я отметил в конце, часть логики not X избыточна (пока задействованы нули). Строки для OwnerId = 4 всегда возвращаются Иногда они просто единственные строки, как когда переключатель выключен. 20.10.2020
  • Да, я не знаю, будет ли условие выглядеть как @input = 1 или оно просто будет вставлено как динамический sql. 20.10.2020
  • Просто замените * на идентификатор в том месте, где это сработало, большое спасибо @shawnt00 21.10.2020
  • Новые материалы

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

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

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

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

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

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

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