programing

MySQL에서 제외하는 방법

fastcode 2023. 8. 28. 22:40
반응형

MySQL에서 제외하는 방법

MySQL에 다음과 같은 쿼리를 작성해야 합니다.

SELECT * 
FROM Tab1
EXCEPT
SELECT * 
FROM Tab1 
WHERE int_attribute_of_Tab1>0

그러나 MySQL은 키워드 EXCUTY를 지원하지 않습니다.MySQL에서 를 제외한 다른 연산자를 올바르게 사용하는 표준 모드가 있습니까?

NOT IN을 사용할 수 있습니다.

SELECT * 
FROM Tab1
WHERE id  NOT IN (
    SELECT id 
    FROM Tab1 
    WHERE int_attribute_of_Tab1>0
)

사용해 보세요.

SELECT * 
FROM Tab1
WHERE [....] NOT EXISTS 
(SELECT * 
FROM Tab1 
WHERE int_attribute_of_Tab1>0) 

몇 가지 정의 SqlServer https://learn.microsoft.com/en-us/sql/t-sql/language-elements/set-operators-except-and-intersect-transact-sql EXCUST 쿼리에서 오른쪽 쿼리에서도 반환되지 않는 고유한 값을 EXCUST 연산자 왼쪽에 반환합니다.PLsql https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries004.htm MINUS 문은 첫 번째 쿼리에서 반환된 고유 행만 반환하고 두 번째 쿼리에서는 반환되지 않는 MINUS 연산자와 결과를 결합합니다.

mysql에 대한 현학적인 번역은

 SELECT distinct t1.* 
FROM Tab1 as t1
left outer join
(SELECT * 
FROM Tab1 
WHERE int_attribute_of_Tab1>0) as t2 on t1.id = t2.id
where t2.id is null;

id 열이 있다고 가정하고, 많은 열에 구분하여 사용하고 싶지 않습니다.

여러 개를 사용할 수 있습니다.NOT IN와 결합된 연산자AND여러 열의 연산자입니다.예:

SELECT col1, col2 FROM table1 WHERE col1 NOT IN(SELECT col1 FROM table2) AND col2 NOT IN(SELECT col2 FROM table2)...;

MySQL 버전 8.0.31 업데이트 이후 이 DBMS에서 운영자를 사용할 수 있게 되었습니다. MySQL 버전을 업데이트할 수 있는 경우, 다음과 같은 표기법을 사용할 수 있습니다.

SELECT * FROM Tab1
EXCEPT
SELECT * FROM Tab1 
WHERE int_attribute_of_Tab1>0

Tab1에 기본 키(예: ID)가 있는 경우 다음을 사용할 수 있습니다.NOT EXISTS이렇게 그 자체로:

SELECT * 
FROM Tab1 AS t1
WHERE NOT EXISTS (
    SELECT 1 
    FROM Tab1 AS t2
    WHERE t2.ID = t1.ID
      AND t2.int_attribute_of_Tab1 > 0
)

하지만 이 경우에는 의미가 없습니다.
그리고 이는 EXCUT/MINUS가 하려고 하는 것이 아닙니다.
(동일한 행 제외)

질문과 관련된 질문입니다.EXCEPT동일한 테이블을 두 번 사용합니다.
그래서 그것을 뒤집습니다.WHERETab1의 기준은 동일한 결과를 제공합니다.

SELECT * 
FROM Tab1 
WHERE (int_attribute_of_Tab1 <= 0 OR int_attribute_of_Tab1 IS NULL) 

만약 그것이 두 개의 다른 테이블이었다면, 이것은

SELECT t1col1, t1col2, t1col3
FROM Table1
EXCEPT
SELECT t2col4, t2col5, t2col6
FROM Table2
WHERE int_attribute_of_Tab1 > 0

선택한 각 열을 비교하여 대체할 수 있습니다.

SELECT DISTINCT t1col1, t1col2, t1col3
FROM Table1 AS t1
WHERE NOT EXISTS (
    SELECT 1 
    FROM Table1 AS t2
    WHERE t2.t2col4 = t1.t1col1
      AND t2.t2col5 = t1.t1col2
      AND t2.t2col6 = t1.t1col3
      AND t2.int_attribute_of_Tab1 > 0
)

저는 이 솔루션을 발견했지만 모든 분야를 고려하고 있으며 단순한 선택 *은 아닐 것입니다.

하나의 테이블 tbl_tab에 필드 ID, 이름, att1, att2, fin_year가 있다고 가정합니다. tbl_tab에는 fin_year =fin_year의 50개 레코드와 fin_year =fin_year의 25개 레코드가 있습니다.

이제 fin_year 20233을 제외한 fin_year 2022에 대한 탭 1의 모든 데이터를 가져오려면 다음 작업을 수행해야 합니다.

select * from tbl_tab 
where fin_year=2022 and id not in (
select t1.id 
from tbl_tab t1 
inner join tbl_tab t2 
   on t2.name=t1.name
   and t2.att1=t1.att1
   and t2.att2=t1.att2
where t1.fin_year=2022
and t2.fin_year=2023);

이는 다음과 같습니다.

select name, att1, att2, fin_year from tbl_tab where fin_year=2022
except 
select name , att1, att2, fin_year from tbl_tab where fin_year=2023;

언급URL : https://stackoverflow.com/questions/46872015/alternative-to-except-in-mysql

반응형