[SQL] 방법과 같은이 SQL에서 조인을 사용하는?
SQL방법과 같은이 SQL에서 조인을 사용하는?
나는 테이블 A와 테이블 B를 말하고,이 개 테이블을하고 난 조인을 수행 할, 그러나에서 열 전이나 열에서 후 올 수있는 것을 의미 B에서 열 '처럼'어디 일치하는 조건이 있어야한다 비:
예를 들어 : A의 열이 '갑'이됩니다. 그 다음은 B에서 열이 하나 인 경우 일치합니다 조인 'fooblah', 'somethingfooblah'하거나 'foo는'. 나는 문 같은 표준에 와일드 카드를 사용하는 방법을 알고 있지만, 조인을 수행 할 때 혼란 스러워요. 이게 말이 되요? 감사.
해결법
-
==============================
1.INSTR 사용 :
INSTR 사용 :
SELECT * FROM TABLE a JOIN TABLE b ON INSTR(b.column, a.column) > 0
등을 사용하여 :
SELECT * FROM TABLE a JOIN TABLE b ON b.column LIKE '%'+ a.column +'%'
CONCAT과 같은 사용 :
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
가장 효율적인은이 계획 출력을 EXPLAIN에 궁극적으로 의존한다.
WHERE 절을 작성하는 조항이 동일한 가입. 조인 구문은 또한 표준화 되었기 때문에 ANSI 조인이라고합니다. 비 ANSI 같은 모습을 조인 :
SELECT * FROM TABLE a, TABLE b WHERE INSTR(b.column, a.column) > 0
나는 예를 들어 가입 비 ANSI LEFT 귀찮게하지 않을거야. 는 ANSI의 장점은 구문이 실제로 WHERE 절에서 무슨 일이 일어나고 있는지에서 함께 테이블을 조인 무엇 분리한다는 것입니다 가입.
-
==============================
2.MySQL의에서 당신은 시도 할 수 있습니다 :
MySQL의에서 당신은 시도 할 수 있습니다 :
INNER FROM SELECT * 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)
-
==============================
3.이 자주 수행해야합니다 뭔가가 있다면 ... 당신은 테이블 A와 B 사이의 관계를 비정규 할 수 있습니다
이 자주 수행해야합니다 뭔가가 있다면 ... 당신은 테이블 A와 B 사이의 관계를 비정규 할 수 있습니다
예를 들어, 테이블 B에 삽입에, 당신은 부분적인 맵핑을 기초로 juncion 테이블 매핑 B에 0 개 이상의 항목을 작성할 수 있습니다. 마찬가지로, 두 테이블에 대한 변경 사항이 연결을 업데이트 할 수 있습니다.
이것은 모든 A와 B가 수정되는 빈도 테이블에 따라 달라집니다. 그들은 상당히 정적 인 경우에, INSERT에 타격을 복용 SELECT에 덜 고통스러운 후 반복 안타입니다.
-
==============================
4.A의 조건 기준이 가입 사용하면 Where 절보다 확실히 다르다. 테이블 간의 기본은 절 조인 및 그 사이의 차이를 만들 수 있습니다.
A의 조건 기준이 가입 사용하면 Where 절보다 확실히 다르다. 테이블 간의 기본은 절 조인 및 그 사이의 차이를 만들 수 있습니다.
예를 들어, 외부 조인에서와 마찬가지로 조건을 사용하여에 나열된 첫 번째 테이블의 모든 기록을 보관합니다 가입 할 수 있습니다. WHERE 절에 동일한 조건을 사용하여 암시 적으로이 조인 내부 조인 변경됩니다. 두 테이블 WHERE 절에서 비교 조건을 달성하기 위해서는 기록은 일반적으로 존재한다.
나는 일반적으로 이전 한 답변에 주어진 스타일을 사용합니다.
tbl_A as ta LEFT OUTER JOIN tbl_B AS tb ON ta.[Desc] LIKE '%' + tb.[Desc] + '%'
나는을 제어 할 수있는이 방법은 유형을 가입 할 수 있습니다.
-
==============================
5.우리의 서버 LIKE 또는 (T-SQL 또는 CHARINDEX) INSTR으로 쿼리를 작성하면 우리는 다음과 같은 구조에서 같은 LEFT를 사용하므로, 너무 오래 걸리 :
우리의 서버 LIKE 또는 (T-SQL 또는 CHARINDEX) INSTR으로 쿼리를 작성하면 우리는 다음과 같은 구조에서 같은 LEFT를 사용하므로, 너무 오래 걸리 :
select * from little left join big on left( big.key, len(little.key) ) = little.key
나는 훨씬 더 빨리 당신은 단지 B + '%'를해야하는 경우 '%'+ B + '%'와 다른 제안과는 달리, 쿼리에 엔딩 변화와 그 힘에만 작업을 이해하지만 충분합니다.
속도 (그러나 메모리)을 위해 최적화하는 또 다른 방법은 "lenkey"사용자 등 "렌 (little.key)"는 "작은"의 열을 생성하는 대신 위의 쿼리한다.
from https://stackoverflow.com/questions/1386166/how-to-use-a-like-with-a-join-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 역사 / 감사 데이터베이스 (0) | 2020.05.19 |
---|---|
[SQL] SQL 쿼리는 여러 테이블을 조인 - 너무 느린 (8 표) (0) | 2020.05.19 |
[SQL] 여러 테이블에서 SQL SELECT (0) | 2020.05.19 |
[SQL] 왜 DELETE 문에 별칭을 사용할 수 없습니다? (0) | 2020.05.19 |
[SQL] 오브젝트 [INFORMATION_SCHEMA]에서 확인할 수없는 기준. TABLES] (0) | 2020.05.19 |