web-dev-qa-db-ja.com

SQLを使用して複数のフィールドから区別して選択する

雑学クイズゲームデータベースの回答に対応する5つの列があります-right、wrong1、wrong2、wrong3、wrong4

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

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

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

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

12
Bryan

これにより、テーブルからすべての異なる値が得られるはずです。特定の質問に対してのみ選択する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
15
achinda99
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)
8
Kristen

私は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;
5
achinda99

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

2
scwagner

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

ご存知のように、設計では、一般的なデータ削減の問題を解決するためにハックする必要がありました。

2
Randal Schwartz

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

select distinct c1 from t

1
JoshBerke

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を追加します。

0
Quassnoi

これが正解です。

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 
0
Bryan