选择除重复之外的所有值

时间:2015-02-20 21:27:26

标签: android sql sqlite

我有三张桌子。 第一。名称:ExTable。列:id(整数),名称(文本)

--------------------
|  id  |    name |
--------------------
|  1   |    exA    |
|  2   |    exB    |
|  3   |    exC    |
--------------------

第二名:名称:CerTable。列:id(整数),名称(文本)

-------------------
|  id  |    name  |
-------------------
|  1   |    first |
|  2   |    second|
|  3   |    third |
-------------------

第三名:名称:CerExTable。列:id(整数),来自CerTable的id_cer(整数),id_ex(整数) - 来自ExTable。

----------------------------------
|  id  |      id_cer     | id_ex |
----------------------------------
|  1   |    1 (first)    |1 (exA)|
|  2   |    1 (first)    |2 (exB)|
|  3   |    1 (first)    |3 (exC)|
|  3   |    2 (second)   |1 (exA)|
|  3   |    2 (second)   |3 (exC)|
|  3   |    3 (third)    |2 (exB)|
---------------------------------

所以,我想选择id_cer = 2和id_ex!=(不等于!)1和3的数据。所以,我想获得下一个值:exB。如果id_cer = 3,我想得到:exA,exC,如果id_cer = 1,我想得到null。

我的SQL查询:

SELECT ExTable.id, ExTable.name FROM ExTable, CerExTable WHERE CerExTable.id_cer = 2 AND CerExTable.id_ex != ExTable.id

预期结果:

--------------------
|  id  |    name   |
--------------------
|  2   |    exB    |
--------------------

但结果是下一个:

--------------------
|  id  |    name   |
--------------------
|  2   |    exB    |
|  3   |    exC    |
|  1   |    exA    |
|  2   |    exB    |
--------------------

因为此查询首先获取“除exA”之外的数据 - exB,exC,然后“除了C” - exA,exB

如何“一次”获取数据异常而不是两行(例如)?

1 个答案:

答案 0 :(得分:0)

如果您更改了选择*,您将看到您确实在进行更复杂的查询。结果是:

SELECT * FROM ExTable, CerExTable WHERE CerExTable.id_cer = 2 AND CerExTable.id_ex != ExTable.id;

---------------------------------------------------
|      ExTable     |           CerExTable         |
---------------------------------------------------
|  id  |    name   |  id  |    id_cer   |  id_ex  |
---------------------------------------------------
|  2   |    exB    |   3  |      2      |    1    |
|  3   |    exC    |   3  |      2      |    1    |
|  1   |    exA    |   3  |      2      |    3    |
|  2   |    exB    |   3  |      2      |    3    |
---------------------------------------------------

所有这些行都满足您要查询的WHERE条件。

获得此结果的解决方案是在同一查询中使用2个选项:

SELECT * FROM ExTable WHERE ExTable.id NOT IN (SELECT CerExTable.id_ex FROM CerExTable WHERE CerExTable.id_cer = 2);