与多个值相比,<> 是如何工作的?

How <> works when compared with multiple values?

我有一个 table 和示例数据如下。

create table MyTable
(
Col1 NUMBER,
Col2 VARCHAR2(30)
)

MyTable
Col1    Col2

1    |  Val1
2    |  Val2
3    |  Val3
4    |  Val4

下面是已经由其他人编写并部署到应用程序的查询。

SELECT Col2
FROM MyTable A WHERE Col1 IN (2,3,4)
AND NOT EXISTS
(SELECT 1
FROM MyTable B
WHERE B.Col1 <> A.Col1) 

在这种情况下,<>如何比较多个值? 它只是与值 2 进行比较吗?或者随机比较 2,3 或 4 中的任意值?

数值一一比较

如果您有示例数据:

CREATE TABLE MyTable(col1, col2) AS
SELECT 1, 'Val1' FROM DUAL UNION ALL
SELECT 2, 'Val2' FROM DUAL UNION ALL
SELECT 3, 'Val3' FROM DUAL UNION ALL
SELECT 4, 'Val4' FROM DUAL;

然后:

SELECT *
FROM   MyTable A
WHERE  Col1 IN (2,3,4)

将return 3行:

COL1 COL2
2 Val2
3 Val3
4 Val4

完整查询:

SELECT Col2
FROM   MyTable A
WHERE  Col1 IN (2,3,4)
AND    NOT EXISTS(
         SELECT 1
         FROM MyTable B
         WHERE B.Col1 <> A.Col1
       )

然后对于每一行,它将检查 NOT EXISTSMyTable table 中 B.Col1 <> A.Col1 的行。在您的例子中,主查询中每个匹配的行在 sub-query 中存在 3 行。您可以通过查询看到这一点:

SELECT Col2,
       (SELECT LISTAGG(col1, ',') WITHIN GROUP (ORDER BY col1)
        FROM   MyTable B
        WHERE  B.Col1 = A.Col1) AS equal,
       (SELECT LISTAGG(col1, ',') WITHIN GROUP (ORDER BY col1)
        FROM   MyTable B
        WHERE  B.Col1 <> A.Col1) AS not_equal
FROM   MyTable A
WHERE  Col1 IN (2,3,4)

输出:

COL2 EQUAL NOT_EQUAL
Val2 2 1,3,4
Val3 3 1,2,4
Val4 4 1,2,3

鉴于总是存在(多于)一行,那么 NOT EXISTS 条件将排除每一行并且您的结果集将为空。

db<>fiddle here