2010-01-07 4 views
2

테이블이 A이고 문장이 가득 찼습니다.테이블을 통해 SQL을 대체

단어와 약어의 두 열이있는 다른 테이블 B이 있습니다.

테이블 A의 열 문장을 살펴보고 테이블 B의 단어 열의 단어가 일치하면 약어로 바꿉니다.

희망은 분명합니다.

사례가 중요하지 않아도 처리 할 수 ​​있습니다. 모든 것이 상한 또는 하등 어떤 것으로 가정하십시오.

+0

나는 그것이 순수한 SQL이 작업을 수행 할 수 생각하지 않습니다 , 어떤 언어를 우리에게 계획하고 있습니까? 이자형? 성능에 대한 우려가 있습니까? 이게 자주 나올까요? – Clash

+0

순수한 SQL (MySQL)을 찾고 있었으나 성능상의 문제는 아니 었습니다. – Llynix

답변

1

SQL만으로는이 작업을 수행 할 수 없습니다. 데이터베이스에서 데이터를 가져 와서 조작 한 다음 다시 밀어 넣어야합니다.

여러 가지 방법이 있지만 일부는 더 간단하고 다른 일부는 더 효율적입니다.

예를 들어 단순하지만 느린 방법은 모든 문장의 모든 단어에 대한 쿼리를하고있어

sentence_list = db.execute("SELECT id, sentence FROM A") 
for sentence in sentence_list do 
    words = tokenize(sentence.text) 

    for word in words do 
     abbrev = db.execute("SELECT abbrev FROM B WHERE word=word") 
     if abbrev 
      word = abbrev 

    sentence.text = concat(words) 
    db.execute("UPDATE A SET sentence=" + sentence.text + " WHERE id = " + sentence.id + ")") 

아니라 성능이 중요한 상황에 권장하지만 일을 ... (의사 코드에서) 일 것이다.

-1

당신은 미칠 수 있고 Excel에서 mysql ODBC 연결을 추가 할 수 있습니다. 하나의 쿼리 테이블에서 문장을 쿼리하고 다른 테이블에서 조회 단어를 쿼리 한 다음 테이블을 새로 고치고 검색 및 바꾸기를 수행 한 다음 테이블로 다시 가져 오는 작은 매크로를 작성합니다. 나는 Msql에서 DTS/SSIS에서이 모든 작업을 자동으로 수행 할 수 있음을 알고 있습니다.

0

나는이 오래된 질문 알고 있지만 응답이 없기 때문에, 나는이와 시도주지 :

SQL Fiddle

의 MySQL 5.5.32 스키마 설정 :

CREATE TABLE Table1 
    (`Id` int, `Sentence` varchar(80)) 
; 

INSERT INTO Table1 
    (`Id`, `Sentence`) 
VALUES 
    (1, 'Mister John is going to Los Angeles') 
; 

CREATE TABLE Table2 
    (`Id` int, `Word` varchar(60), `Abbrev` varchar(10)) 
; 

INSERT INTO Table2 
    (`Id`, `Word`, `Abbrev`) 
VALUES 
    (1, 'Mister', 'Mr.'), 
    (2, 'Los Angeles', 'L.A.') 
; 


DROP PROCEDURE IF EXISTS updateSentences // 

CREATE PROCEDURE updateSentences() 
BEGIN 

    DECLARE count INT; 

    SELECT COUNT(*) INTO count 
    FROM Table1 
    INNER JOIN Table2 ON CONCAT(' ',Sentence,' ') LIKE CONCAT('%',Word,'%'); 

    WHILE count > 0 DO 
    UPDATE Table1 
    INNER JOIN (SELECT t1.id, Word,Abbrev 
      FROM Table1 t1 
      INNER JOIN Table2 ON CONCAT(' ',Sentence,' ') LIKE CONCAT('%',Word,'%') 
      LIMIT 1) Table2 ON Table1.Id = Table2.Id 
    SET Sentence = REPLACE(Sentence,Word,Abbrev); 
    SELECT COUNT(*) INTO count 
    FROM Table1 
    INNER JOIN Table2 ON CONCAT(' ',Sentence,' ') LIKE CONCAT('%',Word,'%'); 
    END WHILE; 
END// 

쿼리 :

SELECT * 
FROM Table1 

[결과] :

| ID |       SENTENCE | 
|----|-------------------------------------| 
| 1 | Mister John is going to Los Angeles | 

검색어 :

CALL updateSentences() 

SELECT * 
FROM Table1 

Results :

| ID |     SENTENCE | 
|----|---------------------------| 
| 1 | Mr. John is going to L.A. | 
관련 문제