2010-02-05 180 views
2

我有这个表需要帮助查询

NAME|VALUE| 
T | A 
T | NONE 
T | B 
S | NONE 

其中值NONE在现实NULL值。


我需要做一个查询谁将会返回所有的行,但如果个名字有一个值 我只应这样他的值返回行结果为上表:

NAME|VALUE| 
T | A 
T | B 
S | NONE 

你知道做这样的查询吗?

在此先感谢您的帮助。

+0

每个名称最多有两行?每个名称会有最多一行吗?如果不是,您想要返回哪个值? –

+0

难道会有像(T,A),(T,A)这样重复的名称值对,或者是否存在唯一的约束? –

回答

1

是否有最多两个值?也就是说,只能获得单个值,“无”或每个值之一。如果是这样,你可以这样做:

​​

我相信下面将针对一般情况下(一个或多个非NONE值可能)工作:

SELECT name, value FROM <tablename> WHERE value <> 'NONE' 
UNION 
SELECT name, value FROM <tablename> WHERE value = 'NONE' 
    AND name NOT IN (SELECT name FROM <tablename> WHERE value <> 'NONE') 
+0

不存在MAX值,因为字段值是文本。 – mada

+0

@mada:这是一个非常重要的信息 - 你应该在问题中提到这一点。否则,GROUP BY和MAX将是一个很好的解决方案。 –

+0

MAX仍然适用于文本字段。在任何一个名称只有两个可能的值的情况下(非“NONE”和“NONE”),我们可以利用MAX从聚合中删除NULL的事实,留下单个非NONE值。根据定义,这个值是MAX。如果只为特定名称找到NONE值,我们将MAX返回的NULL更改回字符串“NONE”(现在添加一个编辑以涵盖此案例)。 –

1

这里是你可以做的一种方式:

SELECT T1.NAME, T2.VALUE 
FROM (SELECT DISTINCT name FROM Table1) AS T1 
LEFT JOIN (SELECT * FROM Table1 WHERE VALUE IS NOT NULL) AS T2 
ON T1.NAME = T2.NAME 

结果:

S NULL 
T A 
T B 
+0

第二个不能工作,因为子选择从(..)返回1列和第一个查询忽略结果中所需的结果(S,NONE)。 – mada

+0

@mada:什么?我不明白你的评论。什么是'无'?你的意思是NULL?空值不会被忽略,因为它是* LEFT *连接,而不是连接。如果匹配失败,则LEFT连接返回NULL。 –

+0

无意思是NULL。 – mada