Почему был бы, “Куда 1 <> 1” в запросе возвращают все строки?

Здесь может помочь узел String Manipulation с regexMatcher, хотя результатом будет String (со значениями True / False по умолчанию), поэтому потребуется дополнительный узел, если для Например, требуется число (если другая строка, вы можете использовать троичный оператор ? / :, например == "True" ? "when true" : join("when false it was because '", $columnReference$, "' was not found")).

Вы можете использовать regexMatcher следующим образом ( \Q / \E помогает избежать обработки содержимого столбца Reference как регулярного выражения (кроме случаев, когда оно содержит \E)) :

regexMatcher($text$, join(".*?\\Q", $Reference$, "\\E.*+")) == "True" ? "vrai" : "faux"

regexMatcher($text$, join(".*?\Q", $Reference$, "\E.*+"))

6
задан S Ennis 19 March 2009 в 23:33
поделиться

15 ответов

Это определенно похоже на ошибку в коде слияния представления оптимизатора Oracle. Я держал пари, что Вы только получаете это с представлениями, которые содержат внешние объединения. Ваш ORDER BY решает его, потому что это практически вызывает a NO_MERGE на представлении.

Я не поместил бы ни одного ORDER BY или a NO_MERGE подскажите в представлении, хотя, потому что (в зависимости от Вашего объема данных) оно могло ухудшить производительность других запросов, которые используют представление. Необходимо поместить подсказку no_merge во внешний запрос:

Select /*+ NO_MERGE(foo) */ *
From foo
where
    1 <> 1

Необходимо также повысить SR с поддержкой Oracle, поскольку это - определенно ошибка. Тот запрос никогда не должен возвращать строки независимо от того, что Вы выбираете из, или насколько сложный это внутри. Никогда.

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

5
ответ дан 8 December 2019 в 02:09
поделиться

Частичное решение

Обновите Представление путем добавления order by 1 после where пункт.

WHERE clbuttic.asset_type = bar.asset_type
    AND bar.field16 = yadda.field9(+)
    AND bar.field1 = snafu.field1(+)
    AND (bar.field17 IS NULL)
order by 1;

Это лечит симптом (и я не должен перекомпилировать и повторно развернуть код), но не говорит мне, почему я получаю это странное поведение.

Обновление: Выполнение порядка на строковой константе имеет то же влияние, но не изменяется, план (как показано объясняют план). Я подозревает, что будет выполняться быстрее, что порядок 1 (то, которое я думаю, должно отсортировать по первому столбцу).

WHERE clbuttic.asset_type = bar.asset_type
    AND bar.field16 = yadda.field9(+)
    AND bar.field1 = snafu.field1(+)
    AND (bar.field17 IS NULL)
order by "a";
0
ответ дан 8 December 2019 в 02:09
поделиться

Связанный с мыслями Cody Casterline: возможно, полон столбец 1 в представлении Нулевых значений? Если Oracle интерпретирует, ГДЕ как "значение в столбце 1, не равном для оценки в столбце 1" и значении в столбце 1, является НУЛЕВЫМ, мы входим, странный мир SQL АННУЛИРУЕТ. Это имеет место на каждом диалекте SQL, я знаю, что NULL=NULL не верен. Возможно, Oracle решила, что ПУСТОЙ УКАЗАТЕЛЬ <> ПУСТОЙ УКАЗАТЕЛЬ поэтому должен быть верным?

0
ответ дан 8 December 2019 в 02:09
поделиться

SELECT вероятно, не повреждается. Во-первых, получите точную строку запроса, это вызывает это поведение. Выполните запрос непосредственно на DB, не через приложение VB 6. Проблема все еще происходит? Пойдите оттуда.

0
ответ дан 8 December 2019 в 02:09
поделиться

Было бы очень интересно видеть план выполнения относительно запроса, с помощью...

explain plan for select ...;

select * from table(dbms_xplan.display);

При запросах представления затем, это могло бы показать, как предикат оценивается в неправильной фазе

1
ответ дан 8 December 2019 в 02:09
поделиться

Возможно, если Вы хотели просто протестировать соединение с базой данных.

1
ответ дан 8 December 2019 в 02:09
поделиться

Вы обычно использовали бы что-то как этот, когда Вы хотите только возвратить весь из столбцы для таблицы SQL. Если это не работает в Oracle, можно хотеть попробовать что-то так же неправильно как:

Select *
From foo
where
    1 == 2

или возможно

where
    key < 0
1
ответ дан 8 December 2019 в 02:09
поделиться

WHERE 1 = 1 должен вызвать полное сканирование таблицы, так же, как исключение WHERE пункт полностью. При получении каждой строки от таблицы конечно, это - полное сканирование таблицы.

Я не могу прокомментировать о WHERE 1 <> 1 отказ работать как ожидалось над Oracle. Это звучит действительно неправильным. Вы уверены, что видели результат, который Вы описываете от того запроса? Попробуйте его снова, чтобы быть уверенными.

1
ответ дан 8 December 2019 в 02:09
поделиться

Почему использование, ГДЕ 1 <> 1?

Одно место я видел используемый или даже использовал его сам, как быстрый способ скопировать структуру таблицы, не копируя содержание:

create table foo2
as select * from foo where 1 <> 1;

(за исключением того, что я всегда использую! =, а не <> - который я действительно не был должен (см. комментарий счета)),

Очевидная ошибка Oracle

Если у Вас есть случай, где можно ясно продемонстрировать, что Oracle возвращает строки в SQL Плюс то, когда Вы выполняете "выбор * от my_view, где 1 <> 1" затем необходимо связаться с поддержкой Oracle (или заставить уполномоченное лицо в компании делать так): это указало бы на значительную ошибку. Конечно, если Вы будете использовать старую версию Oracle, то они, вероятно, просто скажут Вам обновлять!

3
ответ дан 8 December 2019 в 02:09
поделиться

Это собирается звучать странным, но представление/таблица имеет столбец названным "1"?

2
ответ дан 8 December 2019 в 02:09
поделиться

Походит на ошибку в объединяющем представление коде в Oracle. Oracle возьмет Ваш оператор Where и объединит его в представление SQL и затем придумает план относительно этого.

Попробуйте свой выбор с помощью этой подсказки и посмотрите, уходит ли проблема:

SELECT /*+ NO_MERGE */ ...

Вы могли также посмотреть на ОБЪЯСНИТЬ ПЛАН получить некоторое понимание, что идет не так, как надо.

3
ответ дан 8 December 2019 в 02:09
поделиться

Когда Вы хотите динамично генерировать a WHERE пункт. Таким образом, Вы могли просто добавить некоторых OR [another-condition] пункты и заставляют его работать, не проверяя, является ли условие первым или нет.

5
ответ дан 8 December 2019 в 02:09
поделиться

Oracle не делает этого для меня:

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Mar 19 13:36:20 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production

SQL> select * from wrkr where 1 <> 1;

no rows selected

SQL> select count(*) from wrkr;

  COUNT(*)
----------
        88

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

SQL> create view foo as select * from wrkr;

View created.

SQL> select count(*) from foo;

  COUNT(*)
----------
        88

SQL> select * from foo where 1 <> 1;

no rows selected
7
ответ дан 8 December 2019 в 02:09
поделиться

Хорошо... то, почему это произошло бы в Oracle, вне меня. Однако я могу сказать Вам, почему это часто используется в другом DBS: когда человек хочет возвращенные столбцы, но никакие значения. (Такой что касается создания схемы для новой таблицы)

15
ответ дан 8 December 2019 в 02:09
поделиться

Просто мозговая атака здесь, и может быть абсолютно неправильной, но я хочу сказать, что я видел, что некоторый синтаксический анализ синтаксических анализаторов SQL закрыл кавычки целые числа как значение "столбца X". Можно подтвердить это путем попытки:

ВЫБЕРИТЕ 1 ИЗ нечто ГДЕ 1 <> 1

Если 1 полно значений из первого столбца Вашей таблицы, Вы, вероятно, хотите придерживаться заключенных в кавычки целых чисел:

ВЫБЕРИТЕ * ИЗ НЕЧТО ГДЕ '1' <> '1'

Но, снова, я мог быть абсолютно неправым здесь. Я не сделал, чтобы Oracle установила удобный для испытания его на.:p

2
ответ дан 8 December 2019 в 02:09
поделиться
Другие вопросы по тегам:

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