2015-01-05 2 views
-1

concat을 사용하여 일치하지 않는/손상된 키 열 (ID)이있는 일치하는 레코드를 선택하려고합니다.키 열이없는 행 선택

아래는 나에게

SELECT 
    tmpsonglist.xfade 
FROM 
    tmpsonglist 
WHERE 
    (concat_ws('',tmpsonglist.album, tmpsonglist.genre) = concat_ws('',songlist.album, songlist.genre)) 

samdb.songlist.albumError Code: 1054. Unknown column 'samdb.songlist.album' in 'where clause' 실제로 존재 않는 오류를 제공, 나는 쿼리가 WHERE tmpsonglist.ID = songlist.ID를 사용하여 작동합니다 알고있다.

이렇게하면 concat을 사용할 수 있습니까? 또는이 항목을 일치시키기 위해 키 열이 있어야합니까?

편집 :

내가 포함 된 별칭 내 시도를 업데이트 만, 여전히 오류 Error Code: 1093. You can't specify target table 'songlist' for update in FROM clause

를 얻을 수있다

SET SQL_SAFE_UPDATES=0; 
UPDATE samdb.songlist 
SET 
    songlist.xfade = (SELECT 
      t.xfade 
     FROM 
      tmpsonglist AS t, 
      songlist AS s 
     WHERE 
      t.album = s.album 
       AND filename LIKE '%201501.mp3'); 
SET SQL_SAFE_UPDATES=1; 
+0

이 쿼리와 관련해서는 존재하지 않습니다. 테이블 별명은'from' 절에 정의되어 있지 않으므로'songlist'는 인식되지 않습니다. –

+0

아, 별칭이 필요한지 궁금했는데 오류가 아니 었습니다. 별칭 '은 나에게 새롭다 :) ID 열을 사용하면 어떻게 정상적으로 좋은 결과를 얻을 수 있을까? –

+0

일반적으로 ID 필드는 a) 대개 키 또는 기본 키가 있고 b) 키를 결합 할 때 키를 사용할 수 있기 때문에 가장 잘 작동합니다. 필드 (concat_ws)를 사용하여 질문하는 것처럼 표현식에 참여하면 키를 사용할 수 없으므로 쿼리가 훨씬 느려집니다. – Tom

답변

0

내 생각 엔 당신이 원하는 쿼리는 것을 :

UPDATE samdb.songlist s 
    SET s.xfade = (SELECT t.xfade 
        FROM tmpsonglist t 
        WHERE t.album = s.album AND filename LIKE '%201501.mp3' 
       ); 

일치하는 항목이 없으면 xfade이 로직과 함께 NULL으로 설정됩니다.