복붙노트

[SQL] SQL을 사용하여 여러 분야에서 서로 다른 선택

SQL

SQL을 사용하여 여러 분야에서 서로 다른 선택

오른쪽 wrong1, wrong2, wrong3, wrong4 - 나는 5 열이 퀴즈 게임 데이터베이스에 대한 답변에 해당하는이

나는 중복없이 가능한 모든 응답을 반환합니다. 나는 임시 테이블을 사용하지 않고 이러한 목표를 달성하기 위해 기대했다. 가능이 비슷한을 사용할 수 있나요?

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

하지만이 3 열을 반환합니다. 나는 별개의 답변의 열을 하나하고 싶습니다.

시간 내 줘서 고마워

해결법

  1. ==============================

    1.이 테이블에서 당신에게 모든 고유 값을 제공해야합니다. 나는 조항은 특정 질문에 대해 선택한 위치를 추가 할 거라고 추정. 그러나,이 솔루션은 5 개 하위 쿼리가 필요하고 테이블이 큰 경우 속도가 느려질 수 있습니다.

    이 테이블에서 당신에게 모든 고유 값을 제공해야합니다. 나는 조항은 특정 질문에 대해 선택한 위치를 추가 할 거라고 추정. 그러나,이 솔루션은 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. ==============================

    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 ALL을 사용)

    당신은 당신이 UNION ALL을 사용하는 경우에만, UNION을 사용하는 경우 그 경우 안

    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. ==============================

    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. ==============================

    4.그럼 당신은 UNION을 사용하고 5 SELECT 문, 테이블의 각 열에 하나를 실행할 수 있습니다. 그것은 다음과 같이 보일 것입니다 :

    그럼 당신은 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. ==============================

    5."오른쪽 wrong1, wrong2, wrong3, wrong4"의 열 당신이 잘못 설계된 데이터베이스가 있음을 의미한다. 일반적으로, 열 이름에 숫자 또는 문자 접미사는 문제를 다시 생각하는 붉은 깃발이어야한다.

    "오른쪽 wrong1, wrong2, wrong3, wrong4"의 열 당신이 잘못 설계된 데이터베이스가 있음을 의미한다. 일반적으로, 열 이름에 숫자 또는 문자 접미사는 문제를 다시 생각하는 붉은 깃발이어야한다.

    당신은 관찰, 당신의 디자인은 일반적인 데이터 감소 문제에 대한 해결책을 얻기 위해 주위를 해킹 할 필요합니다.

  6. ==============================

    6.이것은 당신이 원하는 무엇인가?

    이것은 당신이 원하는 무엇인가?

    t 구별 C1을 선택할

  7. ==============================

    7.MySQL과 MS SQL에서 :

    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의 경우, 번호 선택의 각 DUAL에서 추가.

  8. ==============================

    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 
    
  9. from https://stackoverflow.com/questions/546804/select-distinct-from-multiple-fields-using-sql by cc-by-sa and MIT license