簡體   English   中英

在 WHERE 子句中具有多個返回值的 MySQL 子查詢返回空集

[英]MySQL subquery with multiple return values in WHERE clause returns empty set

在 WHERE 條件中使用子查詢時,查詢返回空集:

如果我這樣做:(1)

USE general_db;
SELECT * FROM general_db.master WHERE alert IN ('M1_001','G1_011');
+------+-------------+
| mkey | alert       |
+------+-------------+
|   17 | G1_011      |
|   19 | M1_001      |
+------+--------+----+

(1) 按預期工作。

然后我做:(2)

SELECT DISTINCT TABLE_NAME AS 'alert' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='maintenance_db';
+-------------+
| alert       |
+-------------+
| G1_011      |
| M1_001      |
+-------------+

(2) 按預期工作。

但是如果我使用第二個查詢 (2) 作為第一個 (1) 的子查詢: (3)

SELECT * FROM general_db.master WHERE alert IN (SELECT DISTINCT TABLE_NAME AS 'alert' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='maintenance_db');

Empty set (0,00 sec)

(3) 沒有按預期工作。 我認為它應該返回與(1)相同的結果。

我怎樣才能讓 (3) 的組合返回與 (1) 中相同的結果? 為什么這個查詢 (3) 不起作用?

更多信息:

您可能已經注意到, maintenance_db 中的表名可能包含在general_db內的master表中名為alert的列中。

這很奇怪。 我確信子查詢語法是正確的,這個查詢工作正常:

SELECT * FROM general_db.master WHERE alert IN (SELECT alert FROM general_db.master WHERE alert IN ('G1_011','M1_001'));

所以我認為這可能與查詢(2)有關。

這有效:

USE maintenance_db;
select * from M1_001;
select * from G1_011;

所以我猜這些名字是正確的。

謝謝

為什么要從 INFORMATION_SCHEMA.COLUMNS 而不是 INFORMATION_SCHEMA.TABLES 表中獲取表名!? 沒有用於按 COLUMNS 表中的列名過濾的地方!

關於什么:

SELECT * 
FROM general_db.master 
WHERE TRIM(alert) IN 
(
    SELECT UPPER(TABLE_NAME) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA='maintenance_db'
)

也不要使用內部查詢,為什么不使用簡單的 JOIN 之類的

SELECT m.* 
FROM general_db.master m
JOIN INFORMATION_SCHEMA.TABLES t ON (UPPER(t.table_name)=TRIM(m.alert) AND t.table_schema='maintenance_db')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM