Sqlite选择查询 - 返回默认行?

Sqlite选择查询 - 返回默认行?

问题描述:

我有一个表Emp例如。Sqlite选择查询 - 返回默认行?

---------------------- 
eName  | eId 
---------------------- 
Anusha  1 
Sunny  2 

说我要找(条目希望编写发现该行并显示它。但是如果它不觉得它预计将显示一个默认行查询id为3.I温度, 999)

select case 
when (total != 0) then (select eName from Emp where eId = 3) 
when (total == 0) then "temp" 
end as eName, 
case 
when (total != 0) then (select eId from Emp where eId = 3) 
when (total == 0) then 999 
end as eId 
from Emp,(select count(*) as total from Emp where eId = 3); 

使用此查询,我写它给了我两行的结果。

temp 999 
temp 999 

我想这是因为 (select count(*) as total from Emp where eId = 3)此查询在从查询的列表。

我尝试使用distinct子句,它给我只有一行。但我有点怀疑,如果我搞乱查询,只试图可能雇用黑客做它。请建议是否有更好的方法来做到这一点,或者如果我错了。

我会知道如何做到这一点,但首先让我给你一个很长的答案,可能会帮助你理解SQL。发生了什么事情是这样的:

您的select子句不会影响您获得的记录数。为了理解发生的事情,让我们简化查询。让我们将其更改为,

select * from emp, (select count(*) as total from emp where eid=3) 

我不知道你怎么想的逗号“EMP”后确实在这里,但SQL认为这是一个老式的加入两个表:emp和通过创建临时表选择计数(*)等。没有WHERE子句,所以这是一个交叉连接,但第二个表只有一个记录,因此该部分无关紧要。但是没有WHERE子句的事实意味着你将得到emp中的每条记录,并加入到count中。所以这个查询的输出是:

ename eid count(*) 
Anusha 1 0 
Sunny 2 0 

如果你有100条记录,你会得到100条结果。

坦率地说,没有真正干净的方法来做你想要的SQL。这是在代码中干净的事情:做一个简单的“select ... where eid = 3”,如果你没有记录,在运行时填写默认值。

但是假设你需要做的是在SQL出于某种原因,我认为最简单的方法是:

select eid, ename from emp where eid=3 
union 
select 999 as eid, 'temp' as ename 
where not exists (select 1 from emp where eid=3) 

在SQL的某些版本中,你需要给第二选择一个虚拟表名,就像甲骨文要求你说“从双重”。

+0

杰伊,我几乎忘了它意味着一个join.Not没有在哪里caluse意思是一个交叉连接对我来说有点新。现在是我刷新我的sql基础知识的时候了。感谢它真的帮助了我目前正在做的事情。这是一个非常详细的解释,非常感谢! – 2012-04-27 20:31:39

+0

我认为有很多可以说是新的语法,你写单词JOIN显示连接。但是,是的,如果您在FROM中命名了两个表格,那么您将第一个表格中的每个记录与第二个表格中的每个记录进行配对,即如果表格A中有3个记录,并且表格B中有4个记录, 3 * 4 = 12个记录,然后受WHERE子句中的条件限制。通常情况下,您希望排除大部分记录的条件,比如a.customer_id = b.customer_id或其他类似的条件,以仅获得有意义的对。 – Jay 2012-05-02 20:58:31