Подтвердить что ты не робот

Выберите отличный от нескольких полей, используя sql

У меня есть 5 столбцов, соответствующих ответам в базе данных о мелочах - правильно, неправильно1, неправильное2, неправильное3, неправильное4

Я хочу вернуть все возможные ответы без дубликатов. Я надеялся выполнить это, не используя временную таблицу. Можно ли использовать что-то похожее на это?:

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

Но это возвращает 3 столбца. Я бы хотел, чтобы один столбец отличался от ответа.

Спасибо за ваше время

4b9b3361

Ответ 1

Это должно дать вам все различные значения из таблицы. Я предполагаю, что вы хотите добавить, где предложения выбрать только для конкретного вопроса. Однако это решение требует 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

Ответ 2

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 не будет возвращать строки, одинаковые для всех столбцов. (Если вы хотите дублировать или знаете, что нет дубликатов, используйте 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)

Ответ 3

Я дал один ответ выше.

Однако я решил гораздо лучше сделать это с помощью 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;

Ответ 4

Ну, вы можете использовать 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

Это даст вам один список, содержащий все ответы. У вас все еще есть дубликаты, хотя если у вас есть несколько копий одного и того же ответа в одном столбце.

Ответ 5

Столбцы "right, wrong1, wrong2, wrong3, wrong4" означают, что у вас есть неправильно спроектированная база данных. В общем случае суффикс числа или буквы на имени столбца должен быть красным флагом, чтобы переосмыслить проблему.

Как вы заметили, ваш дизайн потребовал от вас взломать, чтобы получить решение типичной проблемы с сокращением данных.

Ответ 6

Это то, что вы хотели?

select distinct c1 from t

Ответ 7

В MySQL И 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 к каждому из номеров.

Ответ 8

Это точный ответ.

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