雑学クイズゲームデータベースの回答に対応する5つの列があります-正しい、間違った1、間違った2、間違った3、間違った4
可能な限りの回答を重複せずに返したい。私は一時テーブルを使用せずにこれを達成したいと思っていました。これに似たものを使用することは可能ですか?:
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 を使用する場合はそうではなく、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)
上記の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