MySQL에서의 교차 대신
다음 쿼리를 MySQL에 구현해야 합니다.
(select * from emovis_reporting where (id=3 and cut_name= '全プロセス' and cut_name='恐慌') )
intersect
( select * from emovis_reporting where (id=3) and ( cut_name='全プロセス' or cut_name='恐慌') )
교차점이 MySQL에 없는 것으로 알고 있습니다.그래서 다른 방법이 필요해안내 좀 해주세요.
Microsoft SQL Server의 "RCRESS 피연산자의 왼쪽과 오른쪽 모두에서 쿼리에 의해 반환되는 고유한 값을 반환합니다." 이것은 표준과 다릅니다.INNER JOIN
또는WHERE EXISTS
문의합니다.
SQL Server
CREATE TABLE table_a (
id INT PRIMARY KEY,
value VARCHAR(255)
);
CREATE TABLE table_b (
id INT PRIMARY KEY,
value VARCHAR(255)
);
INSERT INTO table_a VALUES (1, 'A'), (2, 'B'), (3, 'B');
INSERT INTO table_b VALUES (1, 'B');
SELECT value FROM table_a
INTERSECT
SELECT value FROM table_b
value
-----
B
(1 rows affected)
MySQL
CREATE TABLE `table_a` (
`id` INT NOT NULL AUTO_INCREMENT,
`value` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `table_b` LIKE `table_a`;
INSERT INTO table_a VALUES (1, 'A'), (2, 'B'), (3, 'B');
INSERT INTO table_b VALUES (1, 'B');
SELECT value FROM table_a
INNER JOIN table_b
USING (value);
+-------+
| value |
+-------+
| B |
| B |
+-------+
2 rows in set (0.00 sec)
SELECT value FROM table_a
WHERE (value) IN
(SELECT value FROM table_b);
+-------+
| value |
+-------+
| B |
| B |
+-------+
이 특정 질문에서는 id 열이 관련되어 있기 때문에 중복된 값은 반환되지 않습니다.단, 이 질문의 완성을 위해 다음 MySQL의 대체 방법은 다음과 같습니다.INNER JOIN
그리고.DISTINCT
:
SELECT DISTINCT value FROM table_a
INNER JOIN table_b
USING (value);
+-------+
| value |
+-------+
| B |
+-------+
또 다른 예는WHERE ... IN
그리고.DISTINCT
:
SELECT DISTINCT value FROM table_a
WHERE (value) IN
(SELECT value FROM table_b);
+-------+
| value |
+-------+
| B |
+-------+
UNION ALL 및 GROUP BY를 사용하여 교차를 생성하는 더 효과적인 방법이 있습니다. 대규모 데이터 세트에 대한 테스트 결과 성능이 두 배 향상되었습니다.
예:
SELECT t1.value from (
(SELECT DISTINCT value FROM table_a)
UNION ALL
(SELECT DISTINCT value FROM table_b)
) AS t1 GROUP BY value HAVING count(*) >= 2;
INSER JOIN 솔루션에서는 MySQL이 첫 번째 쿼리의 결과를 조회하고 각 행에 대해 두 번째 쿼리에서 결과를 조회하기 때문에 더 효과적입니다.UNION ALL-GROUP BY 솔루션에서는 첫 번째 쿼리의 결과, 두 번째 쿼리의 결과를 쿼리한 후 결과를 한 번에 그룹화합니다.
쿼리에서는 항상 빈 레코드 세트가 반환됩니다.cut_name= '全プロセス' and cut_name='恐慌'
결코 평가하지 않는다true
.
일반적으로는INTERSECT
에MySQL
다음과 같이 에뮬레이트해야 합니다.
SELECT *
FROM mytable m
WHERE EXISTS
(
SELECT NULL
FROM othertable o
WHERE (o.col1 = m.col1 OR (m.col1 IS NULL AND o.col1 IS NULL))
AND (o.col2 = m.col2 OR (m.col2 IS NULL AND o.col2 IS NULL))
AND (o.col3 = m.col3 OR (m.col3 IS NULL AND o.col3 IS NULL))
)
두 테이블 모두에 다음과 같이 표시된 열이 있는 경우NOT NULL
, 를 생략할 수 있습니다.IS NULL
조금 더 효율적인 방법으로 쿼리를 분할하고 다시 작성합니다.IN
:
SELECT *
FROM mytable m
WHERE (col1, col2, col3) IN
(
SELECT col1, col2, col3
FROM othertable o
)
방금 MySQL 5.7에서 확인했는데 아무도 간단한 답변을 제공하지 않아 매우 놀랐습니다: NATURAL JOIN
테이블 또는 (선택 결과)에 동일한 열이 있는 경우 내추럴 조인(NATUAL JOIN)을 사용하여 교차로를 찾을 수 있습니다.
예를 들어 다음과 같습니다.
표 1:
ID, 이름, 작업 ID
'1', '존', '1'
'2', '잭', '3'
'3', 'Adam', '2'
'4', '청구서', '6'
표 2:
ID, 이름, 작업 ID
'1', '존', '1'
'2', '잭', '3'
'3', 'Adam', '2'
'4', '청구서', '5'
'5', '최대', '6'
다음은 질문입니다.
SELECT * FROM table1 NATURAL JOIN table2;
쿼리 결과: ID, 이름, 작업 ID
'1', '존', '1'
'2', '잭', '3'
'3', 'Adam', '2'
완전성을 위해 여기 에뮬레이트하는 또 다른 방법이 있습니다.INTERSECT
에 주의해 주세요.IN (SELECT ...)
일반적으로 다른 답변에서 제시된 형식이 더 효율적입니다.
일반적으로 테이블은mytable
키 「」를 사용해 주세요.id
:
SELECT id
FROM mytable AS a
INNER JOIN mytable AS b ON a.id = b.id
WHERE
(a.col1 = "someval")
AND
(b.col1 = "someotherval")
(「」를 사용하는 의 점에 해 주세요.SELECT *
하면 에 되어 있는 가 됩니다.mytable
는 '가'이기 때문입니다INNER JOIN
데카르트 제품을 생성합니다.)
INNER JOIN
여기서 테이블에서 행 정렬의 모든 순서가 생성됩니다.즉, 행의 모든 조합이 가능한 모든 순서로 생성됩니다.그WHERE
이 절은 필터링을 .a
쌍의 , 그에는 방방 of of of of, 음음 of of of of side side side sideb
그 결과 두 쿼리의 교차로처럼 두 조건을 모두 충족하는 행만 반환됩니다.
문제를 2개의 문장으로 나누십시오.첫 번째로, 다음과 같은 경우 모두 선택합니다.
(id=3 and cut_name= '全プロセス' and cut_name='恐慌')
는 true 입니다.둘째, 모든 것을 선택하고 싶은 경우
(id=3) and ( cut_name='全プロセス' or cut_name='恐慌')
정말이에요.따라서 둘 다 OR로 참여하겠습니다. 왜냐하면 둘 중 하나라도 맞는 사람을 모두 선택하고 싶기 때문입니다.
select * from emovis_reporting
where (id=3 and cut_name= '全プロセス' and cut_name='恐慌') OR
( (id=3) and ( cut_name='全プロセス' or cut_name='恐慌') )
AFIR, MySQL은 INSER JOIN을 통해 CRESS를 구현합니다.
SELECT
campo1,
campo2,
campo3,
campo4
FROM tabela1
WHERE CONCAT(campo1,campo2,campo3,IF(campo4 IS NULL,'',campo4))
NOT IN
(SELECT CONCAT(campo1,campo2,campo3,IF(campo4 IS NULL,'',campo4))
FROM tabela2);
언급URL : https://stackoverflow.com/questions/2621382/alternative-to-intersect-in-mysql
'IT' 카테고리의 다른 글
MySQL은 데이터베이스 파일을 어디에 저장합니까? (0) | 2022.11.27 |
---|---|
Spring MVC 컨트롤러 메서드에서 값이 반환되지 않을 경우 반환되는 항목 (0) | 2022.11.27 |
Android 텍스트 파일은 어떻게 읽나요? (0) | 2022.11.27 |
MariaDB - JSON 어레이를 인덱싱할 수 있습니까? (0) | 2022.11.27 |
MySQL: 신호에 적합한 SQLSTATE 값을 선택하려면 어떻게 해야 합니다. (0) | 2022.11.27 |