2011-01-24 10 views
2

좋아요, 한 테이블의 고유 레코드를 다른 테이블로 복사하려고 시도한 다음 개의 중복 된 레코드를 제거하기 위해 다시 작성하려고합니다. 아래는 내가하기 위해 사용하는 쿼리입니다.distinct select가 올바르게 작동하지 않음

// create new "temp" table 
$Database->Query = " 
CREATE TABLE IF NOT EXISTS `TempQuickIcon` (
    `ListingID` int(11) NOT NULL, 
    `QuickIconID` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 
"; 
$Database->RunQuery(); 

// insert distinctive values but only for this listing id 
$Database->Query = "INSERT INTO TempQuickIcon(`ListingID`,`QuickIconID`) SELECT DISTINCT `ListingID`,`QuickIconID` FROM `_ListingQuickIcon` WHERE `ListingID` = '{$GetNewListingID}'"; 
$Database->RunQuery(); 

// delete this listings records from the original table 
$Database->NewTransaction(); 
$Database->Table = "_ListingQuickIcon"; 
$Database->Conditions = "`ListingID` = '{$GetNewListingID}'"; 
$Database->DeleteRecord(); 

// insert records from "temp" table 
$Database->Query = "INSERT INTO _ListingQuickIcon(`ListingID`,`QuickIconID`) SELECT DISTINCT `ListingID`,`QuickIconID` FROM `TempQuickIcon`"; 
$Database->RunQuery(); 

$Database->Query = "TRUNCATE TABLE `TempQuickIcon`"; 
$Database->RunQuery(); 

좋아, 그래서 분명 나는 데이터베이스 래퍼가 있지만 기능적인 문제는 하나씩을 테스트하여 그 안에 없다는 것을 보장했다. 또한 각 쿼리를 하나씩 테스트했으며 프로 시저가 작동합니다.

그러나 쿼리의 전체 시퀀스를 달리 실행하면 스크립트를 실행할 수 있습니다 ... 오류없이 처리하지만 실제로 DISTINCT를 따르지 않는 것처럼 보입니다. 두 개 이상 (if ... if 거기에 여러 개의 중복) TempQuickIcon에 레코드가 있습니다.

그러나 스크립트의 각 부분을 개별적으로 실행하면 DISTINCT가 수행되고 고유 레코드 만 복사됩니다.

나는 어리석은 뭔가이고 내가 어딘가에서 실수를 저지르고 있다는 것을 알고있다. 그러나 나는 그것을 볼 수 없다.

의견이 있으십니까? 나는 내가 할 수있는 것을 분명히 제공 할 것이다.

+0

첫 번째 생각 : NewTransaction()으로 시작한 트랜잭션을 커밋해야합니까? 이 마이그레이션은 "단계별로"실행할 때 세션이 전체 실행으로 열려있는 동안 단일 단계간에 닫힐 수 있기 때문에 차이가 있습니다. –

+0

'CREATE TABLE을 실행하지 않으면 TempQuickIcon LIKE _ListingQuickIcon; '을 실행하고 고유 키를 추가 한 다음 REPLACE INTO TempQuickIcon을 실행하십시오. SELECT * FROM _ListingQuickIcon; DROP TABLE _ListingQuickIcon; TempQuickIcon을 _ListingQuickIcon으로 바꾸십시오; '? – rik

+0

기술적으로 NewTransation() 함수는 INSERT 또는 UPDATE 쿼리를위한 필드를 작성하기 위해 설계된 래퍼 함수이므로 필요하지 않습니다. 궁극적으로, DeleteRecord()는 "DELETE FROM'_ListingQuickIcon' WHERE''$ GetNewListingID '" – David

답변

1

문제는 내 데이터베이스 래퍼의 일부로, 'RunQuery()'를 실행할 때 쿼리 결과를 가져 오는 함수를 실행하는 것으로서 TRUNCATE 또는 CREATE TABLE과 같은 것으로 설계되었습니다. 하지만, 쿼리를 실행하고 결과를 가져 오려고 시도했을 때 결과 집합을 얻으려고했기 때문에 두 번 실행되었다고 생각됩니다. 나는 꽤 발성을 할 수는 없지만 짧은 이야기는 가져올 레코드가 없을 때 레코드 세트를 가져 오려고했지만 쓰기 프로세스에 영향을 미쳤다는 점입니다.

래퍼를 사용하여 INSERT ... SELECT를 수행하는 데 처음으로 도움이되지는 않습니다. 학습 한 내용 :)

+0

나는 그것이 무엇인가 stoopid다는 것을 알고 있었다 : P – David

0

SELECT DISTINCT ...의 입력란은 모두 NULL 일 수 있습니까? NULL!=NULL이므로 DISTINCT은 fieldA가 NULL이고 rowA가 whereA가 NULL 인 행 X를 고려하지 않습니다.

+0

을 사용할 수 있지만 두 테이블의 두 필드가 모두 NULL이 아니어야합니다. : \ – David

관련 문제