programing

sql에서 join을 사용하여 like를 사용하는 방법

goodcopy 2022. 11. 26. 12:49
반응형

sql에서 join을 사용하여 like를 사용하는 방법

테이블 A와 테이블 B의 2개의 테이블이 있으며 조인(join)을 수행하고 싶은데 일치 조건은 A의 열이 B의 열과 같은 경우 B의 열 앞 또는 뒤에 어떤 것이든 올 수 있다는 의미여야 합니다.

예를 들어 A의 열이 'foo'인 경우.B의 열이 'fooblah', 'somethingfooblah' 또는 'foo' 중 하나일 경우 결합이 일치합니다.표준과 같은 스테이트먼트에서 와일드카드를 사용하는 방법은 알고 있습니다만, 조인할 때는 혼란스럽습니다.이게 말이 되나요?감사해요.

INSTR 사용:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON INSTR(b.column, a.column) > 0

LIKE 사용:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON b.column LIKE '%'+ a.column +'%'

CONCAT와 함께 LIKE 사용:

SELECT *
  FROM TABLE a
  JOIN TABLE b ON b.column LIKE CONCAT('%', a.column ,'%')

모든 옵션에서 대소문자를 구분하지 않고 일치하는 항목을 검색하려면 비교하기 전에 열 값을 대문자로 표시해야 합니다.

SELECT *
  FROM (SELECT UPPER(a.column) 'ua'
         TABLE a) a
  JOIN (SELECT UPPER(b.column) 'ub'
         TABLE b) b ON INSTR(b.ub, a.ua) > 0

가장 효율적인 방법은 궁극적으로 EXPLY 계획 출력에 따라 달라집니다.

JOIN은 글과 WHERE절을 참조하십시오.JOINANSI JOIN을 사용하다【ANSI JOIN】【ANSI JOIN】

SELECT *
  FROM TABLE a,
       TABLE b
 WHERE INSTR(b.column, a.column) > 0

Non-ANSI LEFT JOIN: 비ANSI LEFT JOIN.은 ANSI JOIN에서 하고 있는 것과 입니다.WHERE절을 클릭합니다.

MySQL에서 다음을 시도할 수 있습니다.

SELECT * FROM A INNER JOIN B ON B.MYCOL LIKE CONCAT('%', A.MYCOL, '%');

물론 이는 전체 테이블 스캔을 수행하기 때문에 매우 비효율적인 쿼리입니다.

업데이트: 여기 증명서가 있습니다.


create table A (MYCOL varchar(255));
create table B (MYCOL varchar(255));
insert into A (MYCOL) values ('foo'), ('bar'), ('baz');
insert into B (MYCOL) values ('fooblah'), ('somethingfooblah'), ('foo');
insert into B (MYCOL) values ('barblah'), ('somethingbarblah'), ('bar');
SELECT * FROM A INNER JOIN B ON B.MYCOL LIKE CONCAT('%', A.MYCOL, '%');
+-------+------------------+
| MYCOL | MYCOL            |
+-------+------------------+
| foo   | fooblah          |
| foo   | somethingfooblah |
| foo   | foo              |
| bar   | barblah          |
| bar   | somethingbarblah |
| bar   | bar              |
+-------+------------------+
6 rows in set (0.38 sec)

자주 해야 할 일이라면...그러면 테이블 A와 테이블B의 관계를 정규화할 수 있습니다.

예를 들어 테이블 B에 삽입할 때 부분 매핑에 따라 B를 A에 매핑하는 juncion 테이블에 0 이상의 엔트리를 쓸 수 있습니다.마찬가지로, 어느 쪽의 테이블을 변경하면, 이 어소시에이션이 갱신될 가능성이 있습니다.

이 모든 것은 테이블A와 테이블B의 변경 빈도에 따라 달라집니다.상당히 정적인 경우 SELECT를 반복하는 것보다 INSERT를 눌러도 통증이 덜합니다.

조인에서 조건부 조건을 사용하는 것은 Where 절과는 확실히 다릅니다.테이블 간의 카디널리티에 따라 Joins 구와 Where 구 간에 차이가 발생할 수 있습니다.

예를 들어 외부 결합에서 Like 조건을 사용하면 결합에 나열된 첫 번째 테이블의 모든 레코드가 유지됩니다.Where 절에서 동일한 조건을 사용하면 가입이 암묵적으로 내부 가입으로 변경됩니다.레코드는 일반적으로 Where 절의 조건부 비교를 위해 두 테이블에 모두 존재해야 합니다.

저는 보통 앞의 답변 중 하나를 사용합니다.

tbl_A as ta
    LEFT OUTER JOIN tbl_B AS tb
            ON ta.[Desc] LIKE '%' + tb.[Desc] + '%'

이렇게 하면 결합 유형을 제어할 수 있습니다.

서버 LIKE 또는 INSTR(또는 T-SQL의 CHARINDEX)로 쿼리를 쓸 때 시간이 너무 오래 걸리기 때문에 다음과 같이 LEFT를 사용합니다.

select *
from little
left join big
on left( big.key, len(little.key) ) = little.key

'%' + 'b + '%'의 다른 제안과 달리 쿼리에 대한 다양한 엔딩에서만 작동할 수 있다는 것을 이해하지만, b+'%만 필요한 경우에는 충분하고 훨씬 더 빠릅니다.

속도를 최적화하기 위한 또 다른 방법(메모리는 아님)은 "little"에 "len(little.key)"라는 열을 "lenkey"로 만들고 대신 위의 쿼리에 사용자를 작성하는 것입니다.

언급URL : https://stackoverflow.com/questions/1386166/how-to-use-a-like-with-a-join-in-sql

반응형