한 테이블에서 다른 테이블에 존재하지 않는 모든 레코드를 선택하려면 어떻게 해야 합니까?
table1(ID, 이름)
table2(ID, 이름)
쿼리:
SELECT name
FROM table2
-- that are not in table1 already
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q: 여기서 무슨 일이 일어나고 있나요?
A: 개념적으로 모든 행은table1각 행에 대해 각 행에서 행을 찾으려고 합니다.table2같은 값으로name기둥.그런 소동이 없으면 그냥 나가겠습니다.table2해당 행에 대한 결과의 일부가 비어 있습니다.그런 다음 일치하는 행이 존재하지 않는 결과에서 해당 행만 선택하여 선택을 제한합니다.마지막으로 결과에서 다음 필드를 제외한 모든 필드를 무시합니다.namecolumn(존재한다고 확신하는 컬럼, fromtable1).
모든 경우에 가능한 가장 뛰어난 방법은 아니지만 기본적으로 ANSI 92 SQL을 구현하려는 모든 데이터베이스 엔진에서 작동합니다.
할 수 있다
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
또는
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
이를 실현하기 위한 3가지 기술에 대해서는 이 질문을 참조하십시오.
난 프로디의 대답을 찬성할 만한 충분한 평점이 없다.하지만 나는 크리스의 대답에 대한 코멘트에 동의하지 않을 수 없다.다음과 같은 답변이 있습니다.
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
FAR가 실제로 더 효율적입니다.이유는 모르겠지만, 80만 이상의 레코드에 대해 실행하고 있으며, 위의 두 번째 답변에 대한 우위성과는 큰 차이가 있습니다.내 0.02달러만 줘
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
이것은 당신이 성취할 수 있는 순수한 집합 이론입니다.minus작동.
select id, name from table1
minus
select id, name from table2
여기 나에게 가장 효과가 있었던 것이 있다.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
이것은 내가 시도했던 다른 어떤 방법보다 두 배 이상 빨랐다.
함정에 주의하세요.[ IfName에Table1놀라움으로 인한 Null이 포함되어 있습니다.더 좋은 점은:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
사용할 수 있습니다.EXCEPTmssql 또는MINUSoracle에서는 다음과 같이 동일합니다.
그건 나한테 딱 맞아.
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
다음 쿼리 구조를 사용할 수 있습니다.
SELECT t1.name FROM table1 t1 JOIN table2 t2 ON t2.fk_id != t1.id;
표 1:
| 아이디 | 이름. |
|---|---|
| 1 | 아미트 |
| 2 | 사가 |
표 2:
| 아이디 | fk_id | 이메일 |
|---|---|---|
| 1 | 1 | amit@ma.com |
출력:
| 이름. |
|---|
| 사가 |
먼저 다음과 같은 테이블의 별칭을 정의합니다.t1그리고.t2그 후 두 번째 테이블에 대한 기록을 얻습니다.그 후, 그 레코드는where상태:
SELECT name FROM table2 as t2
WHERE NOT EXISTS (SELECT * FROM table1 as t1 WHERE t1.name = t2.name)
위의 모든 쿼리는 큰 테이블에서 놀라울 정도로 느립니다.전략의 변경이 필요하다.여기 제가 DB에 사용한 코드가 있습니다.필드와 테이블명을 변경하는 것을 번역할 수 있습니다.
이것이 전략입니다.두 개의 암묵적인 임시 테이블을 만들고 그것들을 결합합니다.
- 첫 번째 임시 테이블은 첫 번째 원본 테이블의 모든 행에서 가져옵니다. 두 번째 원본 테이블에는 없는 필드를 제어할 수 있습니다.
- 두 번째 암묵적인 임시 테이블에는 제어하는 열/필드의 동일한 값과 일치하는 두 개의 원래 테이블의 모든 행이 포함됩니다.
- 결합의 결과는 두 개의 원래 테이블(첫 번째 선택에서 가져온 값)에서 동일한 제어 필드 값을 가진 여러 행이 있는 테이블입니다.두 번째 선택에서 나오는 두 번째 선택) 및 첫 번째 원본 테이블의 값이 두 번째 원본 테이블의 값과 일치하지 않는 경우 제어 열 값이 있는 한 줄만 사용합니다.
- 그룹화해서 세어봐카운트가 1이면 일치하지 않고 마지막으로 카운트가 1인 행만 선택합니다.
우아하지는 않지만 위의 모든 솔루션보다 훨씬 더 빠릅니다.
중요: 체크할 컬럼의 인덱스를 유효하게 합니다.
SELECT name, source, id
FROM
(
SELECT name, "active_ingredients" as source, active_ingredients.id as id
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name, "UNII_database" as source, temp_active_ingredients_aliases.id as id
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name
다른 사람이 더 잘 설명할 필요가 있다고 생각할 경우를 대비해서 (아직 코멘트를 할 정도로 쿨하지 않기 때문에) 정답에 다시 붙입니다.
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
FROM에서 mySQL에서 테이블 이름 사이에 쉼표가 필요한 구문을 보았지만 sqlLite에서는 공간을 선호하는 것 같습니다.
결론적으로 잘못된 변수 이름을 사용하면 질문이 남습니다.제 변수들이 더 말이 될 겁니다.콤마가 필요하거나 필요 없는 이유를 설명해주셔야 합니다.
'쿼리'
SELECT * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
개념적으로는 다음과 같습니다.하위 쿼리에서 일치하는 레코드를 가져온 다음 기본 쿼리에서 하위 쿼리에 없는 레코드를 가져옵니다.
위의 모든 방법을 시도해 봤지만, 제 경우에는 효과가 없었습니다.다음 질문이 나에게 효과가 있었다.
SELECT NAME
FROM table_1
WHERE NAME NOT IN
(SELECT a.NAME
FROM table_1 AS a
LEFT JOIN table_2 AS b
ON a.NAME = b.NAME
WHERE any further condition);
언급URL : https://stackoverflow.com/questions/2686254/how-to-select-all-records-from-one-table-that-do-not-exist-in-another-table
'programing' 카테고리의 다른 글
| SQL Server 2008 R2에서 데이터베이스 이름 변경 중 오류 발생 (0) | 2023.04.08 |
|---|---|
| 모든 테이블, 저장 프로시저, 트리거, 제약 조건 및 모든 종속성을 하나의 SQL 문으로 삭제합니다. (0) | 2023.04.08 |
| T-SQL의 테이블 변수로 선택 (0) | 2023.04.08 |
| SQL Server에서 선행 0을 트리밍하기 위한 더 나은 기술 (0) | 2023.04.08 |
| 원격 SQL Server 데이터베이스를 로컬 드라이브에 백업하려면 어떻게 해야 합니까? (0) | 2023.04.08 |
