12

雑学クイズゲームデータベースの回答に対応する5つの列があります-正しい、間違った1、間違った2、間違った3、間違った4

可能な限りの回答を重複せずに返したい。私は一時テーブルを使用せずにこれを達成したいと思っていました。これに似たものを使用することは可能ですか?:

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

ただし、これは3列を返します。明確な回答を1列にまとめてください。

御時間ありがとうございます

4

8 に答える 8

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
于 2009-02-13T17:29:42.783 に答える
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

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)
于 2009-02-13T17:59:20.967 に答える
5

上記の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;
于 2009-02-13T17:47:49.107 に答える
2

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つの列に同じ回答のコピーが複数ある場合は、重複が発生します。

于 2009-02-13T17:19:14.340 に答える
2

「right、wrong1、wrong2、wrong3、wrong4」の列は、データベースの設計が間違っていることを意味します。一般に、列名の数字または文字の接尾辞は、問題を再考するための危険信号である必要があります。

お気づきのように、典型的なデータ削減の問題の解決策を得るには、設計をハックする必要がありました。

于 2009-11-30T03:14:29.270 に答える
1

これはあなたが望んでいたことですか?

select distinct c1 from t

于 2009-02-13T17:18:23.717 に答える
0

MySQLANDで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

于 2009-02-13T17:21:22.803 に答える
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 
于 2009-02-18T20:47:26.250 に答える