복붙노트

[SQL] 어떻게 다른 테이블에 일치하는 항목이있는 행을 선택하려면?

SQL

어떻게 다른 테이블에 일치하는 항목이있는 행을 선택하려면?

나는 데이터베이스 응용 프로그램에 대한 몇 가지 유지 보수 작업을하고 그리고 난 기쁨의 기쁨, 한 테이블의 값은 외부 키의 스타일로 사용되는 경우에도, 테이블에는 외래 키 제약 조건이 없습니다 것을 발견했습니다.

이미 순진 수정되었습니다 이전 오류의 테이블에서 잘못된 데이터의 전체 부하가 있기 때문에하지 않는 행을 찾기 위해, 내가 필요 나는이 컬럼에 FK 제약 조건을 추가하기 위해 노력하고있어,하지만 난 그것을 찾는거야 다른 테이블에 일치하고 삭제합니다.

나는 웹 쿼리 이런 종류의 몇 가지 예를 발견했지만, 그들은 모두 오히려 설명보다는 예제를 제공하는 것, 그리고 그들이 일하는 이유를 이해하지 않습니다.

사람이 차라리이이 혼란의 모든 테이블에 대해 SO에 실행 오는 것보다, 이러한 쿼리 나 자신을 할 수 있도록, 그것은하고있어 사항 다른 테이블에 일치하는 모든 행을 반환하는 쿼리, 무엇을 구성하는 방법을 나에게 설명 할 수 어떤 FK 제약?

해결법

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

    1.다음은 간단한 쿼리는 다음과 같습니다

    다음은 간단한 쿼리는 다음과 같습니다

    SELECT t1.ID
    FROM Table1 t1
        LEFT JOIN Table2 t2 ON t1.ID = t2.ID
    WHERE t2.ID IS NULL
    

    핵심 포인트는

  2. ==============================

    2.더 강력한이기 때문에 내가 LEFT의 경우에, 당신은 즉 더 정확하게, 당신이 가입하고자하는 행을 선택할 수 있습니다 EXISTS 표현을 사용하면 조인 된 테이블에 무엇이 모두를 가지고 가야 가입하세요. 그것의 효율성은 널 (null) 테스트에 가입 LEFT의 경우와 같이 아마 동일합니다.

    더 강력한이기 때문에 내가 LEFT의 경우에, 당신은 즉 더 정확하게, 당신이 가입하고자하는 행을 선택할 수 있습니다 EXISTS 표현을 사용하면 조인 된 테이블에 무엇이 모두를 가지고 가야 가입하세요. 그것의 효율성은 널 (null) 테스트에 가입 LEFT의 경우와 같이 아마 동일합니다.

    SELECT t1.ID
    FROM Table1 t1
    WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)
    
  3. ==============================

    3.

    SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)
    

    표 1은 당신의 외래 키 제약 조건을 추가하려는 열을 가지고 있지만, foreign_key_id_column의 값은 모든 테이블 2의 ID와 일치하지 않습니다.

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

    4.어디 T2는 제약 조건을 추가하는되는 테이블은 다음과 같습니다

    어디 T2는 제약 조건을 추가하는되는 테이블은 다음과 같습니다

    SELECT *
    FROM T2
    WHERE constrained_field NOT
    IN (
        SELECT DISTINCT t.constrained_field
        FROM T2 
        INNER JOIN T1 t
        USING ( constrained_field )
    )
    

    그리고 그 결과를 삭제합니다.

  5. ==============================

    5.우리는 다음과 같은 두 테이블을 보자 (급여 및 직원)

    우리는 다음과 같은 두 테이블을 보자 (급여 및 직원)

    지금은 급여가 아닌 직원 테이블에서 레코드를 원한다. 우리는 3 가지 방법으로이 작업을 수행 할 수 있습니다 :

    select * from employee
    where id not in(select e.id from employee e inner join salary s on e.id=s.id)
    

    select * from employee e 
    left outer join salary s on e.id=s.id  where s.id is null
    

    select * from employee e
    full outer join salary s on e.id=s.id where e.id not in(select id from salary)
    

  6. ==============================

    6.비슷한 질문에서 여기 MySQL의 내부 쿼리가 다른 표에없는 기록을 얻기 위해 가입 작업이있어

    비슷한 질문에서 여기 MySQL의 내부 쿼리가 다른 표에없는 기록을 얻기 위해 가입 작업이있어

    SELECT * FROM bigtable 
    LEFT JOIN smalltable ON bigtable.id = smalltable.id 
    WHERE smalltable.id IS NULL
    

    smalltable는 기록을 누락 한 위치를 모든 기록이 어디에서 Bigtable은입니다. 쿼리 목록이 아닙니다 smalltable에 존재하지만,에서 Bigtable에있는 모든 레코드. 당신은 어떤 다른 매칭 기준으로 ID를 대체 할 수있다.

  7. ==============================

    7.아래 그림과 같이 뷰를 선택할 수 있습니다 :

    아래 그림과 같이 뷰를 선택할 수 있습니다 :

    CREATE VIEW AuthorizedUserProjectView AS select t1.username as username, t1.email as useremail, p.id as projectid, 
    (select m.role from userproject m where m.projectid = p.id and m.userid = t1.id) as role 
    FROM authorizeduser as t1, project as p
    

    및 선택 또는 업데이트에 대한 뷰에서 다음 작업 :

    select * from AuthorizedUserProjectView where projectid = 49
    

    이는 충전 된 비 매칭 컬럼는 null 즉, 아래 그림에 도시 된 바와 같이 결과를 산출한다.

    [Result of select on the view][1]
    
  8. ==============================

    8.나는 그나마 하나 @AdaTheDev에 비해 (최적화 된 알았 )하지만이 사람은) 내가 나를 위해이어야 (사용할 때 빠른 것 같다

    나는 그나마 하나 @AdaTheDev에 비해 (최적화 된 알았 )하지만이 사람은) 내가 나를 위해이어야 (사용할 때 빠른 것 같다

    SELECT id  FROM  table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2
    

    당신은 어떤 다른 특정 속성을 얻고 싶은 경우에 당신은 사용할 수 있습니다 :

    SELECT COUNT(*) FROM table_1 where id in (SELECT id  FROM  table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2);
    
  9. ==============================

    9.First_table SELECT * FROM 마이너스 또 다른 SELECT * FROM

    First_table SELECT * FROM 마이너스 또 다른 SELECT * FROM

  10. ==============================

    10.당신은 이런 식으로 뭔가를 할 수

    당신은 이런 식으로 뭔가를 할 수

       SELECT IFNULL(`price`.`fPrice`,100) as fPrice,product.ProductId,ProductName 
              FROM `products` left join `price` ON 
              price.ProductId=product.ProductId AND (GeoFancingId=1 OR GeoFancingId 
              IS NULL) WHERE Status="Active" AND Delete="No"
    
  11. ==============================

    11.어떻게 두 테이블에 일치하는 항목이있는 행을 선택하려면?

    어떻게 두 테이블에 일치하는 항목이있는 행을 선택하려면?

    
        select * from [dbo].[EmppDetails] e
         right join [Employee].[Gender] d on e.Gid=d.Gid
        where e.Gid is Null
    
        union 
        select * from [dbo].[EmppDetails] e
         left join [Employee].[Gender] d on e.Gid=d.Gid
        where d.Gid is Null
    
    
  12. from https://stackoverflow.com/questions/4076098/how-to-select-rows-with-no-matching-entry-in-another-table by cc-by-sa and MIT license