데이터베이스 응용 프로그램에서 일부 유지 관리 작업을 수행하고 있으며 한 테이블의 값이 외래 키 스타일로 사용되지만 테이블에 외래 키 제약 조건이 없다는 것을 기쁘게 생각합니다.
이 열에 FK 제약 조건을 추가하려고하지만 순전히 수정 된 이전 오류의 테이블에 이미 잘못된 데이터가 많이 있기 때문에 그렇지 않은 행을 찾아야합니다. 다른 테이블과 일치시킨 다음 삭제하십시오.
웹에서 이러한 종류의 쿼리에 대한 몇 가지 예를 찾았지만 모두 설명이 아닌 예를 제공하는 것처럼 보이며 왜 작동하는지 이해하지 못합니다.
사람이 차라리이의 모든 테이블에 대해 SO에 실행 오는 것보다, 이러한 쿼리 나 자신을 할 수 있도록, 그것은하고있어 사항 다른 테이블에 일치하는 모든 행을 반환하는 쿼리, 무엇을 구성하는 방법을 나에게 설명 할 수 엉망 이 FK 제약이 없습니까?
답변
다음은 간단한 쿼리입니다.
SELECT t1.ID
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL
핵심 사항은 다음과 같습니다.
-
LEFT JOIN
사용;Table1
일치하는 행이 있는지 여부에 관계없이 에서 모든 행을 반환 합니다Table2
. -
WHERE t2.ID IS NULL
절; 이렇게하면 반환 된 결과가 반환 된 IDTable2
가 null 인 행으로 제한됩니다. 즉, 해당 특정 ID 에 대한 레코드 가 없습니다 . 에서 ID가 일치하지 않는 모든 레코드에 대해 NULL로 반환됩니다 .Table2
Table1
Table2.ID
Table1
Table2
답변
나는 EXISTS
그것이 더 강력하기 때문에 expression 을 사용할 것입니다. 즉, LEFT JOIN
결합 된 테이블에있는 모든 것을 가져 와야 할 경우에 더 정확하게 결합 할 행을 선택할 수 있습니다. 효율성은 LEFT JOIN
null 테스트의 경우와 동일 합니다.
SELECT t1.ID
FROM Table1 t1
WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)
답변
SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)
표 1에는 외래 키 제약 조건을 추가하려는 열이 있지만 표 2 의 값과 foreign_key_id_column
모두 일치하지는 않습니다 id
.
- 초기 선택에는
id
은 table1 s를 . 이들은 삭제하려는 행이됩니다. NOT IN
를 Where 문에 절은의 값은 행에 대한 쿼리 제한foreign_key_id_column
테이블 2의 목록에없는id
들.SELECT
괄호 안의 문장은 모든 목록을 얻을 것이다id
표 2에있는들.
답변
T2
구속 조건을 추가 할 테이블은 어디에 있습니까?
SELECT *
FROM T2
WHERE constrained_field NOT
IN (
SELECT DISTINCT t.constrained_field
FROM T2
INNER JOIN T1 t
USING ( constrained_field )
)
그리고 결과를 삭제하십시오.
답변
이제 급여가 아닌 직원 테이블의 레코드를 원합니다.
우리는 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)
답변
비슷한 질문에서 MySQL Inner Join Query는 다른 테이블에 레코드를 표시하지 않습니다. 이 작업을 수행했습니다.
SELECT * FROM bigtable
LEFT JOIN smalltable ON bigtable.id = smalltable.id
WHERE smalltable.id IS NULL
smalltable
기록이없는 bigtable
곳 , 모든 기록이있는 곳입니다. 쿼리에는 존재하지 smalltable
않지만에있는 모든 레코드가 나열됩니다 bigtable
. id
다른 일치 기준으로 대체 할 수 있습니다.
답변
아래와 같이 보기 를 선택할 수 있습니다 .
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]