복붙노트

[SQL] 어떻게 SQL 단지 하나의 필드에 중복없이 레코드를 선택하려면?

SQL

어떻게 SQL 단지 하나의 필드에 중복없이 레코드를 선택하려면?

이 같은 3 열이있는 테이블이 있습니다 :

+------------+---------------+-------+  
| Country_id | country_title | State |  
+------------+---------------+-------+    

이 테이블의 많은 레코드가 있습니다. 그들 중 일부는 상태를 가지고 다른하지 않습니다. 이제, 이러한 레코드를 상상 :

1 | Canada  | Alberta  
2 |  Canada | British  Columbia  
3 | Canada  | Manitoba  
4 | China   |

나는 중복없이 국가 이름이 필요합니다. 사실 나는 자신의 ID와 제목이 필요,이 할 수있는 최선의 SQL 명령은 무엇입니까? 나는 아래 양식에 DISTINCT 사용하지만 적절한 결과를 얻을 수 없었다.

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title

내 원하는 결과는 다음과 같이이다 :

1, Canada  
4, China

해결법

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

    1.이 시도:

    이 시도:

    SELECT MIN(id) AS id, title
    FROM tbl_countries
    GROUP BY title
    
  2. ==============================

    2.DISTINCT 키워드입니다 나를 위해 쿼리가 정확한지

    DISTINCT 키워드입니다 나를 위해 쿼리가 정확한지

    그냥 처음이 작업을 수행하려고

    SELECT DISTINCT title,id FROM tbl_countries
    

    나중에 당신에 의해 주문을 시도 할 수 있습니다.

  3. ==============================

    3.DISTINCT 키워드를 사용하기 위해, 당신은 다음과 같이 사용할 수 있습니다 :

    DISTINCT 키워드를 사용하기 위해, 당신은 다음과 같이 사용할 수 있습니다 :

    SELECT DISTINCT 
        (SELECT min(ti.Country_id) 
         FROM tbl_countries ti 
         WHERE t.country_title = ti.country_title) As Country_id
        , country_title
    FROM 
        tbl_countries t
    

    ROW_NUMBER ()를 사용하여 들어, 다음과 같이 사용할 수 있습니다 :

    SELECT 
        Country_id, country_title 
    FROM (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY country_title ORDER BY Country_id) As rn
        FROM tbl_countries) t
    WHERE rn = 1
    

    또한 LEFT JOIN을 사용하여, 당신은이를 사용할 수 있습니다 :

    SELECT t1.Country_id, t1.country_title
    FROM tbl_countries t1
        LEFT OUTER JOIN
        tbl_countries t2 ON t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id
    WHERE
        t2.country_title IS NULL
    

    그리고 EXISTS의 사용, 당신은 시도 할 수 있습니다 :

    SELECT t1.Country_id, t1.country_title
    FROM tbl_countries t1   
    WHERE
        NOT EXISTS (SELECT 1 
                    FROM tbl_countries t2 
                    WHERE t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id)
    
  4. ==============================

    4.이거 한번 해봐

    이거 한번 해봐

    SELECT country_id, country_title 
    FROM (SELECT country_id, country_title,
    CASE
    WHEN country_title=LAG(country_title, 1, 0) OVER(ORDER BY country_title) THEN 1
    ELSE 0
    END AS "Duplicates"
    FROM tbl_countries)
    WHERE "Duplicates"=0;
    
  5. ==============================

    5.MySQL의에서 특별한 열 함수의 GROUP_CONCAT 사용할 수 있습니다 :

    MySQL의에서 특별한 열 함수의 GROUP_CONCAT 사용할 수 있습니다 :

    SELECT GROUP_CONCAT(COLUMN_NAME)
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'computers' AND
        TABLE_NAME='Laptop' AND
        COLUMN_NAME NOT IN ('code')
    ORDER BY ORDINAL_POSITION;
    

    MySQL의에서 정보 스키마가 모든 데이터베이스 서버가 아닌 특정 데이터베이스를 다루고 있음을 언급해야한다. TABLE_SCHEMA = '컴퓨터'즉 서로 다른 데이터베이스 경우 절은 스키마 이름을 지정해야합니다 WHERE의 조건을 검색, 동일한 이름을 가진 테이블이 포함 된 이유입니다.

    문자열은 MySQL의에서 CONCAT 함수와 연결된다. 우리의 문제의 최종 해결책은 MySQL의에서 다음과 같이 표현 될 수있다 :

    SELECT CONCAT('SELECT ',
    (SELECT GROUP_CONCAT(COLUMN_NAME)
     FROM INFORMATION_SCHEMA.COLUMNS
     WHERE TABLE_SCHEMA='computers' AND
        TABLE_NAME='Laptop' AND
            COLUMN_NAME NOT IN ('code')
     ORDER BY ORDINAL_POSITION
    ), ' FROM Laptop');
    

    http://www.sql-ex.ru/help/select20.php

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

    6.절을 갖는 것은 중복 오라클의 항목을 우리는 중복 데이터를 제거 할 수 있습니다 ROWID를 사용하여 찾을 수있는 가장 쉬운 방법입니다 ..

    절을 갖는 것은 중복 오라클의 항목을 우리는 중복 데이터를 제거 할 수 있습니다 ROWID를 사용하여 찾을 수있는 가장 쉬운 방법입니다 ..

    DELETE FROM products WHERE rowid IN (
      SELECT MAX(sl) FROM (
      SELECT itemcode, (rowid) sl FROM products WHERE itemcode IN (
      SELECT itemcode FROM products GROUP BY itemcode HAVING COUNT(itemcode)>1
    )) GROUP BY itemcode);
    
  7. ==============================

    7.SQL에서 중복 행을 무시합니다. 내가 당신을 도울 수있다 생각합니다.

    SQL에서 중복 행을 무시합니다. 내가 당신을 도울 수있다 생각합니다.

        SELECT res2.*
        FROM
        (SELECT res1.*,ROW_NUMBER() OVER(PARTITION BY res1.title ORDER BY res1.id)as num
         FROM 
        (select * from [dbo].[tbl_countries])as res1
        )as res2
        WHERE res2.num=1
    
  8. ==============================

    8.

    select Country_id,country_title from(
       select Country_id,country_title,row_number() over (partition by country_title 
       order by Country_id  ) rn from country)a
       where rn=1;
    
  9. ==============================

    9.중복 행이에 의해 복잡한 쿼리를 제거 할 수 있습니다

    중복 행이에 의해 복잡한 쿼리를 제거 할 수 있습니다

    먼저 #TempTable @TempTableVariable 또는 그 결과를 기억

    어디 상태 #TempTable 또는 @TempTableVariable에서 삭제

    그런 다음 나머지 데이터를 선택합니다.

    행 번호를 작성해야하는 경우 ID 열을 만듭니다.

  10. from https://stackoverflow.com/questions/12239169/how-to-select-records-without-duplicate-on-just-one-field-in-sql by cc-by-sa and MIT license