Sql-подзапрос существует загадка-разочарован до невозможности !
Я переписал этот вопрос, чтобы его было гораздо легче понять - я уверен, что если вы мастер SQL, то сразу же заметите проблему.
два стола:
_Ля
и
_B
_A имеет 2 поля, assessmentsummaryref и questionheadingref (оба int)
_B имеет 4 поля, assessmentsummaryref, questionref, YES и NO (игнорируйте схему, это устаревшая база данных, и я не могу ее изменить).
В таблице _А у меня есть 2 записи.
1-я запись: assessmentsummaryref=1, questionheadingref of 64900016
2-я запись: assessmentsummaryref=1, questionheadingref of 64900017
таблица _B содержит 3 записи.
1-я запись: assessmentsummaryref=1, questionref имеет 64901184, YES=1 и NO-ноль.
2-я запись: assessmentsummaryre=1, questionref имеет 64900185, YES равно NULL и NO=1
3-я запись: assessmentsummaryref=2, questionref имеет 64901222, YES-NULL и NO=1
Итак, что я пытаюсь сделать (пожалуйста, не представляйте мне инструкцию для подсчета, мне нужна команда EXISTS - помните, я упрощаю это для определенной цели (Цель состоит в том, что может быть 200 проверок, а не 3... и есть 20 Объединенных таблиц)).
Итак, что я хочу сделать, так это посмотреть на свои записи, используя приведенную ниже инструкцию: (которая работает без ошибок). Посмотрите на несколько questionheadingref (в моем основном утверждении), а затем выполните проверку EXISTS, чтобы увидеть, имеет ли questionref под questionheadingref ответ " ДА " или " нет " со значением 1. Если все 3 оператора exists выполнены, я хочу, чтобы запись возвращалась.
Есть две разные оценки, а также два вопроса. У меня такое чувство, что это и есть проблема ? может быть?
Я должен сказать это еще раз, потому что вам может быть очевидно выполнить некоторые или и подсчет, чтобы получить 3, которые будут равны результату, который я ищу, но это не тот результат, который я ищу - я упростил исходное утверждение, над которым работаю, и подсчет С или не решит мою проблему, - но я думаю, что кто-то знает причину, по которой это не работает, и, надеюсь, знает существующее решение, которое будет работать. Мне действительно было трудно победить это, так что если ты все-таки победишь его, то будешь моим Громобоем на всю жизнь. ;)
Если у вас есть попытка сделать это - возьмите третье и существующее далее утверждение, и запись появится снова. Это как - то связано с тем, что questionheadingref отличается-даже если все данные совпадают. Я совершенно сбит с толку этим.
SELECT DISTINCT _A.assessmentsummaryref FROM _A INNER JOIN _B ON _A.assessmentsummaryref = _B.assessmentsummaryref WHERE (_A.questionheadingref IN (64900016, 64900017)) AND EXISTS (SELECT 1 FROM [_B] WHERE [_B].[assessmentsummaryref] = [_A].[assessmentsummaryref] AND [_B].[questionref] = 64901184 AND [_B].[YES] = 1) AND EXISTS (SELECT 1 FROM [_B] WHERE [_B].[assessmentsummaryref] = [_A].[assessmentsummaryref] AND [_B].[questionref] = 64901185 AND [_B].[NO] = 1) AND EXISTS (SELECT 1 FROM [_B] WHERE [_B].[assessmentsummaryref] = [_A].[assessmentsummaryref] AND [_B].[questionref] = 64901222 AND [_B].[NO] = 1)
Одна вещь, которую я заметил - это то, что если я укажу assessmentsummaryref в каждом из операторов EXISTS, я действительно получу правильную возвращаемую запись - однако я не буду знать, какими будут эти assessmentsummaryref..
т.е.
WHERE [_B].[assessmentsummaryref] = 1 AND [_B].[questionref] = 64901184 AND [_B].[YES] = 1 AND EXISTS
WHERE [_B].[assessmentsummaryref] = 2 AND [_B].[questionref] = 64901185 AND [_B].[YES] = 1 AND EXISTS
WHERE [_B].[assessmentsummaryref] = 3 AND [_B].[questionref] = 64901184 AND [_B].[YES] = 1 AND EXISTS
Вот почему я использовал
[_B].[assessmentsummaryref] = [_A].[assessmentsummaryref]как я и думал, это позаботится об этом для меня...
Спасибо за ваше время - я действительно ценю это, я знаю, что вы все очень заняты :)
Что я уже пробовал:
перемещение ценностей. и вокруг. и вокруг. и вокруг. и вокруг.
Andy Lanng
Синтаксис выглядит нормально (хотя я сомневаюсь в вашей структуре таблицы, но это выходит за рамки вашего вопроса).
Вы пробовали изменить условие WHERE в присоединяется?
Оно должен будь то данные, которые неверны. Похоже, что один из ваших ответов может быть нулевым? Это приведет к тому, что любое сравнение с операндом '=' вернет true.
Вы говорите, что упростили этот вопрос для нашей пользы. Можете ли вы упростить свои данные по той же причине? Если это так, проверьте запрос еще раз самостоятельно. Если вы все еще получаете неправильные ответы, пожалуйста, опубликуйте весь запрос и тестовые данные.
Member 12561559
данные в порядке, я вручную изменил данные, чтобы получить результаты, а затем изменил значения, чтобы не получить результатов, в качестве теста. Я не могу упростить данные, иначе это разрушит цель, я посмотрю, смогу ли я объяснить это лучше, ниже-Спасибо за ответ, хотя - я действительно ценю время, которое вы потратили на ответ
NightWizzard
Хотя все подзапросы будут возвращать по крайней мере 1 запись, если они выполняются отдельно, может не быть записи, которая полностью заполняет основное предложение where в сочетании со всеми 3 подзапросами. Вы проверили свои данные на это?
Кстати: если вы замените SELECT * на SELECT 1 в своих подзапросах, вашему запросу потребуется меньше памяти для выполнения, и он даст тот же результат.
Member 12561559
Данные в порядке, я изменю SELECT * на SELECT 1, чтобы улучшить производительность - всегда можно сделать с улучшением производительности :) Я посмотрю, смогу ли я лучше изложить это ниже или использовать опцию улучшить вопрос. Спасибо, что вернулись
Jörgen Andersson
Какие значения имеет таблица _B для [assessmentsummaryref] в вашем примере?
Member 12561559
Привет Йорген, изменю вопрос, чтобы показать, что там внутри, так что его видно всем