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)采取指数的优势。