IT

MySQL에서의 교차 대신

itgroup 2022. 11. 27. 11:27
반응형

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.

일반적으로는INTERSECTMySQL다음과 같이 에뮬레이트해야 합니다.

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

반응형