与多个值相比,<> 是如何工作的?
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 EXISTS
在 MyTable
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
我有一个 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 EXISTS
在 MyTable
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