Выберите отличный от нескольких полей, используя sql
У меня есть 5 столбцов, соответствующих ответам в базе данных о мелочах - правильно, неправильно1, неправильное2, неправильное3, неправильное4
Я хочу вернуть все возможные ответы без дубликатов. Я надеялся выполнить это, не используя временную таблицу. Можно ли использовать что-то похожее на это?:
select c1, c2, count(*)
from t
group by c1, c2
Но это возвращает 3 столбца. Я бы хотел, чтобы один столбец отличался от ответа.
Спасибо за ваше время
Ответы
Ответ 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