2015-10-01 2 views
3

Если я хочу получить логическое значение 1, если идентификатор находится в одной из таблиц, а 0, если его нет, что является лучшим/быстрым способом?Множество существует против объединения

A: 2 Exists с ИЛИ

SELECT 
    EXISTS(SELECT 1 FROM a WHERE id = 1) 
    OR EXISTS(SELECT 1 FROM b WHERE id = 1) 

B: 1 Exists с UNION

SELECT EXISTS(
    SELECT 1 FROM a WHERE id = 1 
    UNION 
    SELECT 1 FROM b WHERE id = 1) 

C: Союз с лимитом

SELECT 1 FROM a WHERE id = 1 
    UNION 
    SELECT 1 FROM b WHERE id = 1 
    UNION 
    SELECT 0 
    LIMIT 1 

Если у вас есть способ лучше, чем мой 3 решения, напишите также.

ОПИСЫВАЕТ:

А:

+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra   | 
+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+ 
| 1 | PRIMARY  | NULL | NULL | NULL   | NULL | NULL | NULL | NULL | No tables used | 
| 3 | SUBQUERY | a  | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 2 | SUBQUERY | b  | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
+------+-------------+-------+-------+---------------+---------+---------+-------+------+----------------+ 

Б:

+------+--------------+------------+-------+---------------+---------+---------+-------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra   | 
+------+--------------+------------+-------+---------------+---------+---------+-------+------+----------------+ 
| 1 | PRIMARY  | NULL  | NULL | NULL   | NULL | NULL | NULL | NULL | No tables used | 
| 2 | SUBQUERY  | a   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 3 | UNION  | b   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| NULL | UNION RESULT | <union2,3> | ALL | NULL   | NULL | NULL | NULL | NULL |    | 
+------+--------------+------------+-------+---------------+---------+---------+-------+------+----------------+ 

С:

+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra   | 
+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+ 
| 1 | PRIMARY  | a   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 2 | UNION  | b   | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
| 3 | UNION  | NULL   | NULL | NULL   | NULL | NULL | NULL | NULL | No tables used | 
| NULL | UNION RESULT | <union1,2,3> | ALL | NULL   | NULL | NULL | NULL | NULL |    | 
+------+--------------+--------------+-------+---------------+---------+---------+-------+------+----------------+ 

ответ

0

Может быть, D (не проверено):

SELECT IFNULL((SELECT 1 FROM a,b WHERE a.id=1 OR b.id=1 LIMIT 1),0) 
+0

«Использование буфер объединения» звучит дорого –

Смежные вопросы