Обновление выбранных строк в Firebird

Java имеет пул строк, в котором Java управляет распределением памяти для объектов String. См. String Pools в Java

Когда вы проверяете (сравниваете) два объекта с помощью оператора ==, он сравнивает равенство адресов в пуле строк. Если два объекта String имеют одинаковые адреса, то он возвращает true, в противном случае false. Но если вы хотите сравнить содержимое двух объектов String, вы должны переопределить метод equals.

equals - фактически метод класса Object, но он переопределяется в класс String и дается новое определение, которое сравнивает содержимое объекта.

Example:
    stringObjectOne.equals(stringObjectTwo);

Но помните, что это относится к случаю String. Если вы хотите сравнить регистр без учета регистра, вы должны пойти для метода equalsIgnoreCase класса String.

Давайте посмотрим:

String one   = "HELLO"; 
String two   = "HELLO"; 
String three = new String("HELLO"); 
String four  = "hello"; 

one == two;   // TRUE
one == three; // FALSE
one == four;  // FALSE

one.equals(two);            // TRUE
one.equals(three);          // TRUE
one.equals(four);           // FALSE
one.equalsIgnoreCase(four); // TRUE

1
задан Mark Rotteveel 13 July 2018 в 10:57
поделиться

1 ответ

Ваш подзапрос в существующем является некоррелированным подзапросом, что означает, что он не зависит от значения в записи при обновлении.

Вместо этого используйте

update EW_POLYLINE
set stan_zmiany = 3
where EW_POLYLINE.STAN_ZMIANY = 0
and NOT EXISTS (
    SELECT 1
    FROM EW_OBIEKTY 
    INNER JOIN EW_OB_ELEMENTY 
        ON EW_OBIEKTY.UID = EW_OB_ELEMENTY.UIDO
    WHERE EW_OBIEKTY.STATUS = 0 AND EW_OB_ELEMENTY.TYP <> 1
    AND EW_OB_ELEMENTY.IDE = EW_POLYLINE.ID
)

Обратите внимание на использование not exists вместо exists, потому что вы действительно хотите обновить записи из EW_POLYLINE, которые не соответствуют этому требованию.

Таким образом, вам не нужно левое соединение в подзапросе, а условие EW_POLYLINE.ID = EW_OB_ELEMENTY.IDE делает подзапрос, связанный с внешним оператором обновления.

Также обратите внимание, что это имеет аналогичную форму, как оператор select в последнем решении I приведенный в мой ответ на ваш предыдущий вопрос .

1
ответ дан Mark Rotteveel 17 August 2018 в 13:32
поделиться
  • 1
    По моему опыту, даже не существует, даже хуже, чем существует. – Arioch 'The 13 July 2018 в 11:27
  • 2
    @ Arioch'The я предлагаю тогда, что вы публикуете свой собственный ответ, который обращается к этому. – Mark Rotteveel 13 July 2018 в 11:28
  • 3
    @ Arioch'The MarkRotteveel Большое спасибо, вы оба потрясающие :) – batonico 13 July 2018 в 11:32
Другие вопросы по тегам:

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