2014-10-17 2 views
3

나는 직설적 인 문제가 있습니다. 두 번째 테이블에서 ID 목록을 다른 ID 목록과 일치시킵니다. 다음 쿼리는 올바르게 실행되고 결과를 반환합니다.MySQL 결합은 결과를 반환하지 않습니다.

select * from dataTable where id = 3888; 
select * from moreIDs where mmid = 3888; 

그러나 join 문은 결과를 반환하지 않습니다.

select * from dataTable inner join moreIDs on dataTable.id = moreIDs.mmID; 

내가 왜 어떤 결과를 얻지 못 하겠는가?

+0

이 열의 데이터 형식은 int 또는 numeric입니다. – radar

+0

어떤 값이 실제로 일치합니까? 각각이 3888을 가지고 있기 때문에 정확하게 일치한다는 것을 의미하지는 않습니다 .... –

+0

둘 다 varchar (15) – Anne

답변

2

int를 주석으로 이해 했으므로 문제는 데이터 유형과 관련됩니다.

다음 바이올린은 몇 가지 검사를 보여줍니다 : fiddle. 당신이 int 그것을 비교하는 varchar 열을 쿼리하면

INSERT INTO table1 values ('3888'); 
INSERT INTO table2 values (' 3888 '); -- extra spaces 
INSERT INTO table3 values (3888); 


:

첫째, 나는 다음과 같은 세 개의 테이블을 만들었습니다

CREATE TABLE table1 (id varchar(15)); 
CREATE TABLE table2 (id varchar(15)); 
CREATE TABLE table3 (id int); 


그리고 일부 데이터를 삽입 값이 0이면 varchar은 암시 적으로 int으로 캐스팅되고 여분의 공백이 제거됩니다. 다음 예는 3888를 반환 :

SELECT * FROM table1 WHERE id = 3888; 
SELECT * FROM table2 WHERE id = 3888; 


을하지만 당신이 JOIN 작동이 경기를하려고하면, 당신은 varcharvarchar를 비교하는 것입니다, 그래서 '3888' = ' 3888 '은 거짓으로 평가됩니다.

, 당신은 int (그래서 사용됩니다 캐스트)에 열 중 하나를 변환 할 수 있습니다이 문제를 해결하거나처럼 TRIM() 기능을 사용하려면 :

SELECT * 
FROM table1 
INNER JOIN table2 
ON TRIM(table1.id) = TRIM(table2.id); 


참고 : 가능하면 변환 모두intSARGABLE 쿼리를 얻을 수 있습니다. 인덱스를 사용하면 각 행의 형 변환 (varchar ~ int)이 성능에 영향을 미칩니다.

관련 문제