SQLite条件where子句

时间:2016-01-09 21:49:27

标签: sqlite

我有三张桌子

ZoneTable
ID, Name

UserTable
ID, Name

UserZone
ZoneTableID, UserTableID

现在。

SELECT ID, Name from ZoneTable

给出了完整的区域列表。

如果我执行以下操作

SELECT ZoneTable.ID, ZoneTable.Name from ZoneTable LEFT JOIN UserZone on UserZone.ZoneTableID = ZoneTable.ID WHERE UserTableID = :ID GROUP BY ZoneTable.ID

为我提供了允许用户使用的区域列表。

现在,如果允许所有区域中的用户使用,那么它们就会令人烦恼,那么它们根本不会出现在UserZone中。

无论如何,我可以获得每个特定用户用户的ZoneTableID列表,如果计数为0,那么不要应用where子句,如果count> 0然后只在一个查询中显示特定的区域名称。

如果这是有道理的

由于

2 个答案:

答案 0 :(得分:1)

注意:您不需要使用外部联接,并且可以将查询重写为:

SELECT ID, Name
FROM ZoneTable
WHERE ID IN (SELECT ZoneTableID
             FROM UserZone
             WHERE UserTableID = :ID);

无论如何,您可以将条件添加到WHERE子句中:

SELECT ID, Name
FROM ZoneTable
WHERE ID IN (SELECT ZoneTableID
             FROM UserZone
             WHERE UserTableID = :ID)
   OR NOT EXISTS (SELECT ZoneTableID
                  FROM UserZone
                  WHERE UserTableID = :ID);

或为第二种情况添加第二个查询:

SELECT ID, Name
FROM ZoneTable
WHERE ID IN (SELECT ZoneTableID
             FROM UserZone
             WHERE UserTableID = :ID)
UNION ALL
SELECT ID, Name
FROM ZoneTable
WHERE NOT EXISTS (SELECT ZoneTableID
                  FROM UserZone
                  WHERE UserTableID = :ID);

答案 1 :(得分:0)

您是否考虑过NOT IN子查询?如:in ... OR:ID NOT IN(从userzone选择usertableid,其中usertableid =:ID)