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
절을 참조하십시오.JOIN
ANSI 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
'programing' 카테고리의 다른 글
(function($) {})(jQuery);는 무엇을 의미합니까? (0) | 2022.11.26 |
---|---|
API 호출을 통해 vuex에 새 개체를 추가하고 이미지 URL을 저장하는 방법 (0) | 2022.11.26 |
PHP DOMhtml5 태그 오류/경고 (0) | 2022.11.07 |
JavaScript 객체의 컨스트럭터 (0) | 2022.11.07 |
PHP를 사용하여 암호를 암호화하고 해독하는 가장 좋은 방법? (0) | 2022.11.07 |