복붙노트

[SQL] 방법과 같은이 SQL에서 조인을 사용하는?

SQL

방법과 같은이 SQL에서 조인을 사용하는?

나는 테이블 A와 테이블 B를 말하고,이 개 테이블을하고 난 조인을 수행 할, 그러나에서 열 전이나 열에서 후 올 수있는 것을 의미 B에서 열 '처럼'어디 일치하는 조건이 있어야한다 비:

예를 들어 : A의 열이 '갑'이됩니다. 그 다음은 B에서 열이 하나 인 경우 일치합니다 조인 'fooblah', 'somethingfooblah'하거나 'foo는'. 나는 문 같은 표준에 와일드 카드를 사용하는 방법을 알고 있지만, 조인을 수행 할 때 혼란 스러워요. 이게 말이 되요? 감사.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.이 자주 수행해야합니다 뭔가가 있다면 ... 당신은 테이블 A와 B 사이의 관계를 비정규 할 수 있습니다

    이 자주 수행해야합니다 뭔가가 있다면 ... 당신은 테이블 A와 B 사이의 관계를 비정규 할 수 있습니다

    예를 들어, 테이블 B에 삽입에, 당신은 부분적인 맵핑을 기초로 juncion 테이블 매핑 B에 0 개 이상의 항목을 작성할 수 있습니다. 마찬가지로, 두 테이블에 대한 변경 사항이 연결을 업데이트 할 수 있습니다.

    이것은 모든 A와 B가 수정되는 빈도 테이블에 따라 달라집니다. 그들은 상당히 정적 인 경우에, INSERT에 타격을 복용 SELECT에 덜 고통스러운 후 반복 안타입니다.

  4. ==============================

    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. ==============================

    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)"는 "작은"의 열을 생성하는 대신 위의 쿼리한다.

  6. from https://stackoverflow.com/questions/1386166/how-to-use-a-like-with-a-join-in-sql by cc-by-sa and MIT license