64

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='恐慌') )

intersect が MySQL にないことは知っています。だから私は別の方法が必要です。私を案内してください。

4

8 に答える 8

55

Microsoft SQL Serverの「INTERSECTオペランドの左側と右側の両方のクエリによって返される個別の値を返します」これは、標準またはクエリ とは異なります。INTERSECT INNER JOINWHERE EXISTS

SQLサーバー

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列が関係しているため、重複する値は返されませんが、完全を期すために、andを使用した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     |
+-------+
于 2010-07-08T07:22:47.217 に答える
39

UNION ALL と GROUP BY を使用して、交差を生成するより効果的な方法があります。大規模なデータセットでのテストによると、パフォーマンスは 2 倍優れています。

例:

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;

INNER JOIN ソリューションでは、MySQL が最初のクエリの結果を検索し、次に各行について 2 番目のクエリの結果を検索するため、より効果的です。UNION ALL-GROUP BY ソリューションでは、最初のクエリの結果、2 番目のクエリの結果をクエリし、結果を一度にまとめてグループ化します。

于 2013-06-10T14:59:44.167 に答える
15

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
        )
于 2010-04-12T10:58:06.867 に答える
1

完全を期すために、ここにをエミュレートする別の方法があり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 *このクエリで使用すると、で定義されている列の2倍の列が取得されることに注意してくださいmytable。これは、デカルト積INNER JOINを生成するためです)

ここでは、テーブルから行ペアのすべての順列INNER JOINを生成します。つまり、行のすべての組み合わせが、考えられるすべての順序で生成されます。次に、句はペアの側面をフィルタリングし、次に側面をフィルタリングします。その結果、交差点2のクエリと同様に、両方の条件を満たす行のみが返されます。WHEREab

于 2012-06-08T23:44:11.750 に答える
0

問題を 2 つのステートメントに分割します。まず、次の場合にすべてを選択します。

(id=3 and cut_name= '全プロセス' and cut_name='恐慌')

本当です。第二に、すべてを選択したい場合

(id=3) and ( cut_name='全プロセス' or cut_name='恐慌')

本当です。いずれかが true の場合にすべてを選択したいので、両方を OR で結合します。

select * from emovis_reporting
    where (id=3 and cut_name= '全プロセス' and cut_name='恐慌') OR
        ( (id=3) and ( cut_name='全プロセス' or cut_name='恐慌') )
于 2015-06-16T11:39:31.637 に答える
-2

AFAIR、MySQLはINNER JOINを介して INTERSECT を実装しています。

于 2010-04-12T13:42:17.067 に答える
-2
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);
于 2015-05-27T14:21:12.970 に答える