Member 12561559 Ответов: 1

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

Привет Йорген, изменю вопрос, чтобы показать, что там внутри, так что его видно всем

1 Ответов

Рейтинг:
10

Wendelius

Несколько вещей, чтобы рассмотреть:


  • На данный момент Вы не используете псевдонимы в подзапросах. Это может вызвать неоднозначность в синтаксическом анализаторе, на какой столбец вы на самом деле ссылаетесь. Попробуйте использовать формат
    ... AND EXISTS (SELECT 1
                    FROM  [answer] 
                    WHERE [answer].AssessmentSummaryref = AssessmentSummary.AssessmentSummaryref 
                    AND   [answer].[questionref] = 64901184 
                    AND   [Answer].[YES] = 1)...
  • Если да и нет являются взаимоисключающими, используйте одно поле. Теперь существует вероятность того, что у вас есть ложные данные, вызывающие нелогичный результат
  • Проверьте данные, вы можете использовать, например, следующее, чтобы убедиться, что данные именно такие, какими вы их ожидаете
    SELECT [answer].AssessmentSummaryref, [answer].[questionref], [Answer].[YES], [Answer].[NO]
    FROM  [answer]
    WHERE ( [answer].[questionref] = 64901184 AND [Answer].[YES] = 1)
    OR    ( [answer].[questionref] = 64901185 AND [Answer].[NO] = 1) 
    OR    ( [answer].[questionref] = 64901222 AND [Answer].[NO] = 1)


Member 12561559

Данные в порядке, двойная проверка с физическим видом плюс я запускаю ваш оператор select, должен был вставить join в раздел FROM и включить Propertyref в разделы OR, но у меня были свои 3 записи обратно, с правильными YES, NO. Я собираюсь объяснить это лучше, изменив свой вопрос, я знаю, что это буду я, так что спасибо, что вернулись, ваше время очень ценится.