Я столкнулся с запросом в приложении, которое я унаследовал, и выглядит так:
Select *
From foo
where
1 <> 1
Когда я это анализирую, он ничего не должен возвращать (1 <> 1
должен иметь значение false, верно). Однако (по крайней мере, на моем компьютере с Oracle) возвращается полный список всего в foo
. Когда я пытаюсь сделать то же самое в MSAccess / Jet и MSSQL, я получаю ожидаемое поведение.
Чем он отличается от Oracle (и почему первоначальный разработчик хотел бы это сделать)?
Примечание: я видел какое-то суеверие о + s и -s использования «где 1 = 1», и это вызывало полное сканирование таблицы; но я не думаю, что это был первоначальный разработчик.
Небольшое обновление:
В этом случае foo
является представлением. Когда я пробую то же самое на реальной таблице, я получаю то, что ожидал (без строк).
Обновление 2:
Я следовал коду дальше по кроличьей норе и определил, что все, что он делает, пытается захватить названия полей / столбцов. Я все еще в растерянности относительно того, почему он возвращает полный набор записей; но только по взглядам.
Буквально он строит запрос в строке и передает его для выполнения другой функции без изменений.
'VB6
strSQL = "SELECT * FROM " & strTableName & " WHERE 1 <> 1"
В этом случае strTableName содержит имя представления.
Обновление 3:
Для справки, вот одна из точек зрения, с которыми у меня возникают проблемы.
(Я изменил имена полей / таблиц / схем)
CREATE OR REPLACE FORCE VIEW scott.foo (field1,
field2,
field4,
field5,
field12,
field8,
field6,
field7,
field16,
field11,
field13,
field14,
field15,
field17
)
AS
SELECT bar.field1,
bar.field2,
DECODE
(yadda.field9, NULL, 'N',
DECODE (yadda.field3, NULL, 'Y', 'N')
) AS field4,
bar.field5,
snafu.field6,
DECODE
(snafu.field6,
NULL,
bar.field8,
bar.field8
- snafu.field6
) AS field7,
DECODE
(yadda.field10,
NULL,
bar.field12,
yadda.field10
) AS field11,
DECODE
(SIGN ( yadda.field10 - bar.field12),
NULL, 'N', 1, 'N', 0, 'N', -1, 'Y'
) AS field13,
bar.field14,
ADD_MONTHS
(DECODE (yadda.field10, NULL, bar.field12, yadda.field10
),
bar.field14 * 12
) AS field15,
FROM clbuttic,
bar,
yadda,
snafu
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
(или имя некоторого столбца в списке выбора на foo), похоже, убеждает Oracle вернуть мне пустой набор. Это долгосрочное решение, но не краткосрочное (изменение кода и повторное развертывание - это главное PITA). Я надеюсь, что есть некоторые известные настройки на стороне DB или что-то не так в View, что является причиной этого странного поведения.