雑学クイズゲームデータベースの回答に対応する5つの列があります-right、wrong1、wrong2、wrong3、wrong4
可能な限りの回答を重複せずに返したい。私は一時テーブルを使用せずにこれを達成したいと思っていました。これに似たものを使用することは可能ですか?:
select c1, c2, count(*)
from t
group by c1, c2
ただし、これは3列を返します。明確な回答を1列にまとめてください。
御時間ありがとうございます
これにより、テーブルからすべての異なる値が得られるはずです。特定の質問に対してのみ選択する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
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
UNIONはすべての列で同一の行を返さないため、DISTINCTは不要です。 (複製が必要な場合、または重複が存在しないことがわかっている場合は、パフォーマンスを向上させるためにUNION ALLを使用してください)
これにより、すべての回答を含む単一のリストが得られます。ただし、1つの列に同じ回答のコピーが複数ある場合は、重複が発生します。
UNIONを使用する場合はそうではなく、UNIONALLを使用する場合のみです。
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)
私は1つの答えを提供しました 上記 。
しかし、私は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;
UNIONを使用して、テーブルの各列に1つずつ、合計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
これにより、すべての回答を含む単一のリストが得られます。ただし、1つの列に同じ回答のコピーが複数ある場合は、重複が発生します。
「right、wrong1、wrong2、wrong3、wrong4」の列は、データベースの設計が間違っていることを意味します。一般に、列名の数字または文字の接尾辞は、問題を再考するための危険信号である必要があります。
ご存知のように、設計では、一般的なデータ削減の問題を解決するためにハックする必要がありました。
これはあなたが望んでいたものですか?
select distinct c1 from t
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
を追加します。
これが正解です。
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