Предотвратите Oracle минус оператор от удаления дубликатов

Вы можете использовать fmt.Sscanf, которая является строковой и текущей версией fmt.Scan:

package main

import (
    "fmt"
)

func main() {
    str1 := "Connection to %s is down and error %d is thrown"
    str2 := "Connection to DataBase is down and error 401 is thrown"
    var s string
    var d int
    _, err := fmt.Sscanf(str2, str1, &s, &d)
    if err != nil {
        panic(err)
    }
    fmt.Println(s, d)
}

детская площадка: https://play.golang.org/p/5g5UcrHsunM [113 ]

Примечание. Похоже, вы анализируете ошибку. Если ошибка от Go, весьма вероятно, что она предоставляет данные внутри ошибки, поэтому вам не нужно анализировать их вручную. И если у вас есть контроль над ошибкой, лучше хранить данные внутри.

7
задан PeeHaa 24 November 2013 в 01:54
поделиться

6 ответов

Oracle поддерживает несколько столбцов в операторе IN, поэтому вы можете написать:

SELECT a, b, c
FROM table1
WHERE (a,b,c) not in (
    select a,b,c from table2
)
0
ответ дан 7 December 2019 в 01:25
поделиться

Другой вариант:

SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST1
MINUS
SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST2

Это будет МИНУС, если каждый дубликат будет обрабатываться как отдельная запись. Обратите внимание, что в приведенном ниже примере, если TEST1 имеет два значения 'C', а TEST2 только одно, вы получите одно на выходе.

dev> select * from test1;

T
-
A
A
B
C
C

dev> select * from test2;

T
-
B
C

dev>     SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST1
  2      MINUS
  3      SELECT TEST, row_number() OVER (PARTITION BY TEST ORDER BY TEST) FROM TEST2
  4  /

T ROW_NUMBER()OVER(PARTITIONBYTESTORDERBYTEST)
- --------------------------------------------
A                                            1
A                                            2
C                                            2
8
ответ дан 7 December 2019 в 01:25
поделиться
SELECT field1 FROM table1 WHERE field1 NOT IN (SELECT field2 FROM table2)

Будет работать, пока field2 не может содержать NULL.

1
ответ дан 7 December 2019 в 01:25
поделиться

Часть того, что делает минус, - это удаление дубликатов. Рассмотрите возможность использования NOT IN, чтобы избежать удаления дубликатов.

SELECT TEST FROM TEST1 WHERE TEST NOT IN(SELECT TEST FROM TEST2)
0
ответ дан 7 December 2019 в 01:25
поделиться

модификатор ALL заставляет UNION возвращать все строки (например, UNION ALL ), может быть, это можно применить к МИНУСУ? Как и в

select field1 from table1
minus all
select field2 from table2
0
ответ дан 7 December 2019 в 01:25
поделиться

Все ответы «НЕ В» верны. Альтернативой, которая может быть проще для некоторых сценариев, является оператор «NOT EXISTS»:

SELECT TEST FROM TEST1
WHERE NOT EXISTS
(SELECT null FROM TEST2 WHERE TEST2.TEST = TEST1.TEST);

(Примечание: «null» в предложении select здесь бессмысленно)

Я лично использую оба метода, но мне нравится НЕ СУЩЕСТВУЕТ часто, потому что он более гибкий - например, для него не требуется, чтобы сравнение проводилось по условию равенства.

Последние версии оптимизатора часто преобразуют NOT IN в NOT EXISTS или наоборот; однако, если вы

1
ответ дан 7 December 2019 в 01:25
поделиться
Другие вопросы по тегам:

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