다른 테이블에서 일치하는 항목이 없는 행을 선택하는 방법은 무엇입니까?
저는 데이터베이스 애플리케이션에 대한 유지보수 작업을 하고 있는데, 기쁨의 기쁨을 발견했습니다. 한 테이블의 값이 외래 키 스타일로 사용되고 있음에도 불구하고 테이블에는 외래 키 제약이 없습니다.
이 열에 FK 제약 조건을 추가하려고 하지만, 이전 오류에서 잘못된 데이터가 테이블에 이미 많이 있기 때문에 다른 테이블과 일치하지 않는 행을 찾아서 삭제해야 합니다.
저는 웹에서 이런 종류의 질문에 대한 몇 가지 예를 찾았지만, 그것들은 모두 설명보다는 예시를 제공하는 것 같습니다. 그리고 저는 그것들이 왜 작동하는지 이해할 수 없습니다.
FK 제약 조건이 없는 이 난장판의 모든 테이블에 대해 SO로 달려오는 대신 다른 테이블의 모든 행을 반환하는 쿼리를 구성하는 방법과 쿼리가 무엇을 하고 있는지 누가 설명해 줄 수 있습니까?
다음은 간단한 질문입니다.
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절. ID가 반환된 행에만 반환된 결과를 제한합니다.Table2null입니다. 즉, 에 레코드가 없습니다.Table2그 특정 신분증 때문에Table1.Table2.ID의 모든 레코드에 대해 NULL로 반환됩니다.Table1에서 ID가 일치하지 않는 경우Table2.
식이 더 강력하기 때문에 식을 사용합니다. 예를 들어 가입할 행을 더 정확하게 선택할 수 있습니다.의 경우에는LEFT JOIN당신은 결합된 테이블에 있는 모든 것을 가져가야 합니다.그 효율성은 아마도 다음의 경우와 동일할 것입니다.LEFT JOIN늘 제약 조건으로.
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에는 외부 키 제약 조건을 추가하려는 열이 있지만 다음 값이 있습니다.foreign_key_id_column와 일치하지 않습니다.id표 2에
- 초기 선택은 다음과 같이 나열됩니다.
id표 1의 s.삭제할 행이 됩니다. - 그
NOT INwhere 문의 절은 쿼리를 값이 있는 행으로만 제한합니다.foreign_key_id_column표 2의 목록에 없습니다.ids. - 그
SELECT괄호 안의 문장은 모든 것의 목록을 얻을 것입니다.id2표 2.에 2.는에 s.
다음의 두 테이블(급여와 직원)로 하겠습니다.
이제 저는 급여가 아닌 직원 테이블의 기록을 원합니다.세 가지 방법으로 이를 수행할 수 있습니다.
- 내부 결합 사용
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)
에▁where디T2제약 조건을 추가할 테이블입니다.
SELECT *
FROM T2
WHERE constrained_field NOT
IN (
SELECT DISTINCT t.constrained_field
FROM T2
INNER JOIN T1 t
USING ( constrained_field )
)
그리고 결과를 삭제합니다.
여기 비슷한 질문에서 MySQL Inner Join Query To Get Records가 다른 테이블에 없습니다.
SELECT * FROM bigtable
LEFT JOIN smalltable ON bigtable.id = smalltable.id
WHERE smalltable.id IS NULL
smalltable당신이 잃어버린 기록을 가지고 있는 곳입니다bigtable당신이 모든 기록을 가지고 있는 곳입니다.는 쿼는존재않모레든나다열에 합니다.smalltable 하만존니다에 합니다.bigtable대체할 수 있습니다.id다른 일치 기준에 의해.
나는 어떤 것이 최적화되었는지 몰랐지만(@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);
아래와 같이 보기를 선택할 수 있습니다.
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]
당신은 이런 것을 할 수 있습니다.
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"
SELECT * FROM First_table - SELECT * from other
두 테이블 모두에서 일치하는 항목이 없는 행을 선택하는 방법은 무엇입니까?
[dbo]에서 *를 선택합니다.[Emp 세부 정보] e오른쪽으로 [직원]에 가입합니다.[성별] 됐습니다.Gid=d.Gid어디서Gid가 Null임 조합[dbo]에서 *를 선택합니다.[Emp 세부 정보] e왼쪽 조인 [직원].[성별] 됐습니다.Gid=d.Gid어디서 d.Gid가 Null임
언급URL : https://stackoverflow.com/questions/4076098/how-to-select-rows-with-no-matching-entry-in-another-table
'programing' 카테고리의 다른 글
| Node.js에 대한 올바른 "max-old-space-size"를 어떻게 결정합니까? (0) | 2023.05.23 |
|---|---|
| 단일 명세서를 둘러싼 트랜잭션은 무엇을 합니까? (0) | 2023.05.23 |
| sp_executesql을 사용하려고 하면 "Procedure expects parameter of 'ntext/nchar/nvarchar' 유형의 '@statement'가 표시되는 이유는 무엇입니까? (0) | 2023.05.23 |
| .NET Core와 .NET Standard Class Library 프로젝트 유형의 차이점은 무엇입니까? (0) | 2023.05.23 |
| C#에서 기본 생성자 호출 (0) | 2023.05.23 |


