MySQL Concat/Trim in Select查询是否存在于另一个表中 - 我的代码出了什么问题?
问题描述:
Table_BaseMySQL Concat/Trim in Select查询是否存在于另一个表中 - 我的代码出了什么问题?
+----+----------------+
| ID | ACCOUNT |
+----+----------------+
| 1 | 100 |
| 2 | 120 |
| 3 | 193 |
| 4 | 201 |
| 5 | 213 |
| 6 | 247 |
| 7 | 304 |
+----+----------------+
Table_Transform
+----+----------------+
| ID | Account_Number |
+----+----------------+
| 1 | 100 |
| 2 | 9120 |
| 3 | 193 |
| 4 | 9201 |
| 5 | 9213 |
| 6 | 442 |
| 7 | 589 |
+----+----------------+
所有帐户列中的条目在他们面前的多个空格,所以我使用TRIM()函数。
我需要返回Table_Base中所有不会出现在Table_Transform的Account_Number中的帐户,同时考虑到某些帐户出现在Table_Transform中,前面有9个帐户。因此,应收回的款项是
247
304
然而,我的代码,它忽略了与条款,并返回那些出现在Table_Transform,在他们面前的有9。我应该修复什么?
SELECT * FROM Table_Base
WHERE ACCOUNT NOT IN
(SELECT Account_Number FROM Table_Transform)
AND CONCAT(9,TRIM(ACCOUNT)) NOT IN (SELECT Account_Number FROM Table_Transform);
我相信我与CONCAT查询一个问题,因为我甚至不能让它本身在一个单行SELECT语句工作(它仍然会返回错误)。
答
试试这个
SELECT *
FROM Table_Base
WHERE TRIM(ACCOUNT) NOT IN
(SELECT Account_Number FROM Table_Transform)
AND CAST(CONCAT('9',TRIM(ACCOUNT)) AS UNSIGNED) NOT IN (SELECT Account_Number FROM Table_Transform);
--edit添加CAST
作出额外的肯定 -
一个直接的对等。我会用JOIN
声明,如果你有兴趣
答
我建议NOT EXISTS
。一种方法是:
SELECT b.*
FROM Table_Base b
WHERE NOT EXISTS (SELECT 1
FROM Table_Transform t
WHERE t.Account_Number = trim(b.account) OR
t.Account_Number = concat(9, trim(b.account)
);
出于性能的考虑,不过,我会分裂成这两个表达式:
SELECT b.*
FROM Table_Base b
WHERE NOT EXISTS (SELECT 1
FROM Table_Transform t
WHERE t.Account_Number = trim(b.account)
) AND
NOT EXISTS (SELECT 1
FROM Table_Transform t
WHERE t.Account_Number = concat(9, trim(b.account))
);
这可以在Table_Transform(Account_Number)
采取指数的优势。