Выберите отличный от нескольких полей с помощью sql

Сортировка - это настройка, определяющая, как БД должна обрабатывать символьные данные на уровне сервера, базы данных или столбца. Об этом действительно хороший блог на red-gate. . Каждый сервер и база данных будут иметь параметры сортировки. Обычно базы данных и сервер совпадают, поскольку по умолчанию база данных наследует этот параметр из базы данных model. Редко можно увидеть сопоставление на уровне столбцов , но, похоже, это то, что вы имеете здесь, поскольку все ваши таблицы взяты из одного и того же DATABASE.

Вам нужно будет выяснить, каково сопоставление в этих столбцах. Дейв Пинал написал об этом в своем блоге. Вы также можете сделать это несколькими другими способами. См. Документы для этого.

Как только у вас есть параметры сортировки, вы можете затем сопоставить CONCAT. Это будет выглядеть примерно так: Здесь я просто использую DATABASE_DEFUALT, который, вероятно, будет работать в вашем случае:

CONCAT(TransactionHeader.TicketStub COLLATE DATABASE_DEFAULT,TransactionHeader.TransactionNumber COLLATE DATABASE_DEFAULT) AS [DealRef]

Вы можете найти больше примеров COLLATE WITH CONCAT в этом ответе и в этом [ 1111]

12
задан bonCodigo 31 January 2013 в 18:42
поделиться

8 ответов

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

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

Однако я изобразил намного лучший способ сделать это с помощью 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
ответ дан 2 December 2019 в 04:34
поделиться

Хорошо можно использовать ОБЪЕДИНЕНИЕ и выполнить 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

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

2
ответ дан 2 December 2019 в 04:34
поделиться

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

select distinct c1 from t

1
ответ дан 2 December 2019 в 04:34
поделиться

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

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
ответ дан 2 December 2019 в 04:34
поделиться

В 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 к каждому числу выбирает.

0
ответ дан 2 December 2019 в 04:34
поделиться

Столбцы "правильно, неправильно1, неправильно2, неправильно3, неправильно4" означают, что у вас неправильно спроектированная база данных. В общем, числовой или буквенный суффикс в имени столбца должен быть красным флажком, чтобы переосмыслить проблему.

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

2
ответ дан 2 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: