如何检查特定的ID集是否存在?

时间:2015-05-07 11:04:43

标签: mysql sql postgresql ansi-sql

我有一张源表(它的一部分):

+--------------------+
|  E M P L O Y E E   |
+--------------------+
| ID |   EQUIPMENT   |
+--------------------+
| 1  | tv,car,phone  |
| 2  | car,phone     |
| 3  | tv,phone      |
+----+---------------+

在规范化过程之后,我结束了两个新表:

+----------------+
| DICT_EQUIPMENT |
+----------------+
| ID | EQUIPMENT |
+----------------+
| 1  | tv        |
| 2  | car       |
| 3  | phone     |
+----+-----------+

+---------------------+
|    SET_EQUIPMENT    |
+----+--------+-------+
| ID | SET_ID | EQ_ID |
+----+--------+-------+
| 1  |   1    |   1   |
| 2  |   1    |   2   |
| 3  |   1    |   3   |
| 4  |   2    |   2   |
| 5  |   2    |   3   |
| 6  |   3    |   1   |
| 7  |   3    |   3   |
+----+--------+-------+

(the piece/part)
+-----------------+
| E M P L O Y E E |
+-----------------+
| ID | EQ_SET_ID  |
+-----------------+
| 1  |     1      |
| 2  |     2      |
| 3  |     3      |
+----+------------+

现在当我想找到正确的SET_ID时,我可以这样写:

SELECT SET_ID
  FROM SET_EQUIPMENT S1,
       SET_EQUIPMENT S2,
       SET_EQUIPMENT S3
 WHERE S1.SET_ID = S2.SET_ID
   AND S2.SET_ID = S3.SET_ID
   AND S1.EQ_ID = 1
   AND S2.EQ_ID = 2
   AND S3.EQ_ID = 3;

也许有任何想法来优化此查询?如何找到正确的设置?

2 个答案:

答案 0 :(得分:1)

你错误地归正了。摆脱set_equipment 改为有三个表:员工,设备,employee_equipment。

如果您正在寻找您想要使用的特定员工的设备:

select id, equipment
from equipment eq
inner join employee_equipment ee on eq.id = ee.eq_id
inner join employee emp on emp.id = ee.emp_id
where emp.id = 2

答案 1 :(得分:1)

首先,您应该对正在使用的方法使用显式if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] != NSOrderedAscending) { self.modalPresentationStyle = UIModalPresentationOverFullScreen; } 语法:

join

SELECT S1.SET_ID FROM SET_EQUIPMENT S1 JOIN SET_EQUIPMENT S2 ON S1.SET_ID = S2.SET_ID JOIN SET_EQUIPMENT S3 ON S2.SET_ID = S3.SET_ID WHERE S1.EQ_ID = 1 AND S2.EQ_ID = 2 AND S3.EQ_ID = 3; 子句中的逗号已经过时了。 (并且,这会修复查询中的语法错误。)

另一种方法是将fromgroup by子句一起使用:

having

哪种方法更好地工作取决于许多因素 - 例如,您使用的数据库引擎,表的大小,表上的索引。您必须测试哪种方法在您的系统上更有效。