2010-02-05 211 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