Сортировка - это настройка, определяющая, как БД должна обрабатывать символьные данные на уровне сервера, базы данных или столбца. Об этом действительно хороший блог на red-gate. . Каждый сервер и база данных будут иметь параметры сортировки. Обычно базы данных и сервер совпадают, поскольку по умолчанию база данных наследует этот параметр из базы данных model
. Редко можно увидеть сопоставление на уровне столбцов , но, похоже, это то, что вы имеете здесь, поскольку все ваши таблицы взяты из одного и того же DATABASE
.
Вам нужно будет выяснить, каково сопоставление в этих столбцах. Дейв Пинал написал об этом в своем блоге. Вы также можете сделать это несколькими другими способами. См. Документы для этого.
Как только у вас есть параметры сортировки, вы можете затем сопоставить CONCAT
. Это будет выглядеть примерно так: Здесь я просто использую DATABASE_DEFUALT
, который, вероятно, будет работать в вашем случае:
CONCAT(TransactionHeader.TicketStub COLLATE DATABASE_DEFAULT,TransactionHeader.TransactionNumber COLLATE DATABASE_DEFAULT) AS [DealRef]
Вы можете найти больше примеров COLLATE WITH CONCAT
в этом ответе и в этом [ 1111]
Это должно дать Вам всем отличные значения от таблицы. Я предполагаю, что Вы хотели бы добавить где пункты для выбора только для конкретного вопроса. Однако это решение требует 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
ОТЛИЧНОЕ является лишним, потому что ОБЪЕДИНЕНИЕ не возвратит строки, которые идентичны для всех столбцов. (Когда Вы хотите дублированный, или если Вы знаете, что никакие дубликаты не существуют, используйте ОБЪЕДИНЕНИЕ ВСЕ для более быстрой производительности),
Это даст Вам единственный список, содержащий все ответы. У Вас все еще будут дубликаты хотя, если у Вас будет несколько копий того же ответа в отдельном столбце.
Это не должно иметь место при использовании ОБЪЕДИНЕНИЯ только если Вы используете ОБЪЕДИНЕНИЕ ВСЕ
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)
Я предоставил один ответ выше.
Однако я изобразил намного лучший способ сделать это с помощью 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 избранных операторов, один для каждого столбца в таблице. Это выглядело бы примерно так:
SELECT right FROM answers
UNION
SELECT wrong1 FROM answers
UNION
SELECT wrong2 FROM answers
UNION
SELECT wrong3 FROM answers
UNION
SELECT wrong4 FROM answers
Это даст Вам единственный список, содержащий все ответы. У Вас все еще будут дубликаты хотя, если у Вас будет несколько копий того же ответа в отдельном столбце.
Это - точный ответ.
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
В 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
к каждому числу выбирает.
Столбцы "правильно, неправильно1, неправильно2, неправильно3, неправильно4" означают, что у вас неправильно спроектированная база данных. В общем, числовой или буквенный суффикс в имени столбца должен быть красным флажком, чтобы переосмыслить проблему.
Как вы заметили, ваш дизайн требовал от вас взлома, чтобы найти решение типичной проблемы сокращения данных.