2009-02-13 37 views
12

我必須對應於一個小遊戲數據庫的答案5列 - 右邊,wrong1,wrong2,wrong3,wrong4使用或選擇從多個領域的不同SQL

我想回到所有可能的答案,沒有重複。我希望能夠在不使用臨時表的情況下完成此任務。是否有可能使用類似的東西?:

select c1, c2, count(*) 
from t 
group by c1, c2 

但是,這返回3列。我想要一列獨特的答案。

謝謝你的時間

回答

15

這應該會給你表中所有不同的值。我認爲你想添加where子句來選擇僅用於特定問題。但是,此解決方案需要5個子查詢,並且如果您的表很龐大,則可能會變慢。

SELECT DISTINCT(ans) FROM (
    SELECT right AS ans FROM answers 
    UNION 
    SELECT wrong1 AS ans FROM answers 
    UNION 
    SELECT wrong2 AS ans FROM answers 
    UNION 
    SELECT wrong3 AS ans FROM answers 
    UNION 
    SELECT wrong4 AS ans FROM answers 
) AS Temp 
+1

這看起來不錯。我現在會嘗試。 – Bryan 2009-02-13 17:39:15

1

這是你想要的嗎?

select distinct c1 from t

+1

很難說是否是,但+1因爲它看起來應該是:) – 2009-02-13 17:20:29

+0

是啊很難說明 – JoshBerke 2009-02-13 17:26:03

+0

不,這個選擇不同於一列 – Bryan 2009-02-13 17:36:48

2

那麼你可以使用一個UNION和運行5條SELECT語句,一個爲表中的每一列。它看起來像這樣:

SELECT right FROM answers 
UNION 
SELECT wrong1 FROM answers 
UNION 
SELECT wrong2 FROM answers 
UNION 
SELECT wrong3 FROM answers 
UNION 
SELECT wrong4 FROM answers 

這會給你一個包含所有答案的列表。如果在單個列中有相同答案的多個副本,則仍然會有重複。

0

MySQL AND MS SQL

SELECT 
     CASE 
     WHEN which = 1 THEN c1 
     WHEN which = 2 THEN c2 
     WHEN which = 3 THEN c3 
     WHEN which = 4 THEN c4 
     WHEN which = 5 THEN c5 
     END AS answer, 
     which 
FROM mytable, (
    SELECT 1 AS which 
    UNION ALL 
    SELECT 2 
    UNION ALL 
    SELECT 3 
    UNION ALL 
    SELECT 4 
    UNION ALL 
    SELECT 5 
) w 

對於Oracle,添加FROM DUAL到每個數的選擇。

5

我提供了一個答案above

但是我想一個更好的方法使用UNPIVOT做到這一點。

SELECT DISTINCT(ans) 
FROM (
    SELECT [Name], ANS 
    FROM (
     SELECT right, wrong1, wrong2, wrong3, wrong4 
     FROM answers 
    ) AS PVT 
    UNPIVOT 
    (ans FOR [Name] IN (right, wrong1, wrong2, wrong3, wrong4)) AS UNPVT 
) AS OUTPUT; 

可以提供內部子查詢中的任何WHERE子句:

SELECT DISTINCT(ans) 
FROM (
    SELECT [Name], ANS 
    FROM (
     SELECT right, wrong1, wrong2, wrong3, wrong4 
     FROM answers 
     WHERE (...) 
    ) AS PVT 
    UNPIVOT 
    (ans FOR [Name] IN (right, wrong1, wrong2, wrong3, wrong4)) AS UNPVT 
) AS OUTPUT; 
8
SELECT DISTINCT(ans) FROM (
    SELECT right AS ans FROM answers 
    UNION 
    SELECT wrong1 AS ans FROM answers 
    UNION 
    SELECT wrong2 AS ans FROM answers 
    UNION 
    SELECT wrong3 AS ans FROM answers 
    UNION 
    SELECT wrong4 AS ans FROM answers 
) AS Temp 

的DISTINCT是多餘的,因爲歐盟將不會返回對所有列相同的行。 (當您想重複,或者如果你知道,沒有重複存在,請使用UNION ALL獲得更快的性能)

這會給你一個包含所有答案的單一列表。如果在單個列中有相同答案的多個副本,則仍然會有重複。

這不應該是這樣的,如果你使用UNION,只有當你使用UNION ALL

SELECT [value] INTO #TEMP 
FROM 
(
SELECT [value] = 1 
UNION ALL SELECT 2 
UNION ALL SELECT 3 
UNION ALL SELECT 1 
) AS X 

(4 row(s) affected) 

SELECT [value] 
FROM #TEMP 

value  
----------- 
1 
2 
3 
1 

(4 row(s) affected) 

SELECT [value] 
FROM #TEMP 
UNION 
SELECT [value] 
FROM #TEMP 

value  
----------- 
1 
2 
3 

(3 row(s) affected) 
0

這是確切的答案。

SELECT (ans) FROM (
    SELECT correct AS ans FROM tGeoQuiz 
    UNION 
    SELECT wrong1 AS ans FROM tGeoQuiz 
    UNION 
    SELECT wrong2 AS ans FROM tGeoQuiz 
    UNION 
    SELECT wrong3 AS ans FROM tGeoQuiz 
    UNION 
    SELECT wrong4 AS ans FROM tGeoQuiz 
) AS Temp 
2

「right,wrong1,wrong2,wrong3,wrong4」的列表示您設計錯誤的數據庫。通常,列名上的數字或字母后綴應該是重新考慮問題的紅旗。如您所見,您的設計需要您進行破解以獲得典型數據縮減問題的解決方案。