我有一個表格和示例資料,如下所示。
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 之間的任何值進行比較?
uj5u.com熱心網友回復:
這些值是一一比較的。
如果您有示例資料:
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)
將回傳 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 EXISTSwhereMyTable中B.Col1 <> A.Col1。在您的情況下,對于主查詢中的每個匹配行,子查詢中存在 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 平等的 NOT_EQUAL VAL2 2 1,3,4 VAL3 3 1,2,4 Val4 4 1,2,3
鑒于始終存在(多于)一行,則NOT EXISTS條件將排除每一行,并且您的結果集將為空。
db<>在這里擺弄
uj5u.com熱心網友回復:
您撰寫的子查詢的名稱是“相關子查詢”。對于別名為 A 的 MyTable 的每一行,獲取 A.col1 值,子查詢將其與別名為 B 的 MyTable 中的每個 B.col1 進行比較。如果至少有 1 個 B.col1 滿足此條件,則滿足存在條件:B.Col1 <> A.Col1 并且當子查詢找到滿足該條件的 B.col1 值時,它會退出存在條件并將其回傳為 true,它不會搜索滿足該條件的進一步 B.col1 值(B.Col1 <> A.Col1) . 希望我很清楚。Ps 沒有在子查詢前面看到 NOT 存在,不僅將真值變為假,因此如果條件 (B.Col1 <> A.Col1) 不滿足,它將為真。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467737.html
上一篇:從一串數字生成行
下一篇:PythonSQL插入腳本
