복붙노트

[SQL] 주어진 데이터가 여러 테이블 (모두 같은 열이)에 존재하는지 확인하는 방법?

SQL

주어진 데이터가 여러 테이블 (모두 같은 열이)에 존재하는지 확인하는 방법?

나는 각 열에라는 이름으로 구성된 3 개 테이블이있다. 등록 부분에, 나는 요청 된 사용자 이름이 새롭고 독특한 것을 확인해야합니다.

그 사용자가 이러한 모든 테이블에있는 경우 내가 계속하기 전에, 말해 것이다 단일 SQL이 필요합니다. 나는 시도했다 :

SELECT tbl1.username, tbl2.username, tbl3.username
FROM tbl1,tbl2,tbl3
WHERE tbl1.username = {$username}
   OR tbl2.username = {$username}
   OR tbl3.username ={$username}

길을 가고인가요?

해결법

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

    1.

    select 1 
    from (
        select username as username from tbl1
        union all
        select username from tbl2
        union all
        select username from tbl3
    ) a
    where username = 'someuser'
    
  2. ==============================

    2.경우에 당신은 정직 단지 사용자가 존재하는지 알고 싶어 :

    경우에 당신은 정직 단지 사용자가 존재하는지 알고 싶어 :

    가장 빠른 방법은 존재 쿼리입니다 :

    select 
    NOT EXISTS (select username from a where username = {$username}) AND 
    NOT EXISTS (select username from b where username = {$username}) AND 
    NOT EXISTS (select username from c where username = {$username});
    

    사용자 이름 열이 각 테이블에서 고유로 표시되어있는 경우, 이것은 당신이이 작업을 수행 할 수있을 것입니다 가장 효율적인 쿼리를해야하고,이 아니라, 거의 모든 다른, 메모리 사용의 관점에서 정규화 된 이름 테이블을 능가 할 것 있기 때문에 사용자 이름과 다른 컬럼에 대한 관심은, 과도한 조인 없다고 쿼리. 만약 당신이 조직의 데이터베이스를 속도에 호출 된 경우에, 나는 오버 정상화 악몽이라고 말씀 드릴 수 있습니다. 이 스레드에서 정상화에받은 조언에 관해서,주의해야합니다. 그것은 공간을 제한하거나 업데이트 데이터에있는 장소의 수를 제한하기위한 좋은,하지만 당신은 유지 보수 및 속도 오버 헤드에 대해 그 무게해야합니다. 에누리이 페이지에서 제공 한 조언을 가져 가라.

    당신이 당신의 바다 다리를 얻을 적어도까지 - 쿼리를 작성할 때 선택의 파급 효과를 학습하는 습관을하는 것보다 다른 이유가있는 경우, 쿼리에 쿼리 분석기를 실행하는 데 사용하기.

    경우에는 나중에 사용자를 삽입 할 :

    당신은 결국 데이터베이스에 사용자를 추가하기위한 목적으로이 일을하는 경우, 여기에 더 나은 방법이며, 그것을 배울 가치가있다. 즉시 값을 삽입하려고합니다. 그것이 성공하면 확인 후 확인합니다. 이 방법은 당신이 검사 한 시간과 데이터베이스에 삽입 된 시간 사이에 레코드를 삽입하는 다른 데이터베이스 호출의 여지가 없다. 예를 들어, MySQL은 당신이 할 수 있습니다 :

    INSERT INTO {$table} (`username`, ... )
      SELECT {$username} as `username`, ... FROM DUAL 
       WHERE 
         NOT EXISTS (select username from a where username = {$username}) AND 
         NOT EXISTS (select username from b where username = {$username}) AND 
         NOT EXISTS (select username from c where username = {$username});
    

    모든 데이터베이스 API는 내가 모든 SQL 구현은 당신에게 많은 행이 삽입 된 방법을 발견 할 수있는 방법을 제공 할뿐만 아니라, 본 것입니다. 그것은 1의 경우, 사용자 이름은 존재하지 않았고 삽입에 성공했습니다. 이 경우, 내가 특별히 테이블에 바인딩되지 않은 결과를 반환하기위한 DUAL 테이블을 제공하는 MySQL의를 선택한, 그리고 귀하의 방언 모르지만, 정직하게, 피부에이 고양이에 대한 여러 가지 방법이 있습니다, 여부를 당신은 거래 또는 저장 프로 시저에 넣어, 또는 엄격하게이 테이블에 액세스 할 수있는 프로세스 및 절차를 제한 할 수 있습니다.

    업데이트 - 공정 최대 부호를 완료하지 않은 사용자를 처리하는 방법

    등록이 여러 단계에서 수행되는 경우 @RedFilter이 지적 하듯이 - 사용자 이름을 예약 세부 사항을 작성, 아마도 이메일 확인 응답 적어도, 타임 스탬프와 (플래그로를이 사용자 열을하지 추가하려면, 당신은 원할 것입니다 부울) 당신은 정기적으로 나는 ToBePurged 테이블을 만드는 것이 좋습니다 있지만, 시간이 기간 이후에 사용자를 제거하고 타임 스탬프와 함께, 그 새로운 사용자를 추가 할 수 있도록. 확인을 통해 올 때, 당신은이 테이블에서 사용자를 제거합니다. 정기적으로 당신은 당신의 현재 시간 떨어져 일부 델타하기 전에 모든 항목이 테이블을 확인하고 단순히 원래 추가 된 쪽 테이블에서 삭제합니다. 이 뒤에 나의 철학은 더 명확하게 테이블의 책임을 정의하고 당신은 매우 희박 작업중인 레코드 수를 유지하는 것입니다. 우리는 확실히 우리의 솔루션을 오버 엔지니어링 싶지 않아,하지만 당신은 좋은 건축 관행의 습관을 경우, 이러한 설계는 덜 효율적인 대응으로 자연스럽게 흘러 것입니다.

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

    3.제 두 프로세스가 동시에 테스트를 실행할 수 모두에는 사용자가보고하지 않을 것이다 다음 모두 동일한 사용자를 삽입 할 수 있습니다.

    제 두 프로세스가 동시에 테스트를 실행할 수 모두에는 사용자가보고하지 않을 것이다 다음 모두 동일한 사용자를 삽입 할 수 있습니다.

    당신이 중복을 방지하기 위해 고유 인덱스로 모든 사용자를 보유하는 하나의 테이블이 필요 것 같은데. 이 마스터 테이블은 사용자 ID가 아닌 사용자 이름을 사용하여 '하위 테이블'에 링크 할 수 있습니다.

  4. ==============================

    4.1 당신은 당신의 테이블을 정상화 할 필요가

    1 당신은 당신의 테이블을 정상화 할 필요가

    참조 : http://databases.about.com/od/specificproducts/a/normalization.htm

    2 음주 89 조인 암시 SQL을 사용하지 마십시오.

    습관을 걷어차 고 명시 적 조인 사용

    SELECT a.field1, b.field2, c.field3
    FROM a
    INNER JOIN b ON (a.id = b.a_id)  -- JOIN criteria go here
    INNER JOIN c ON (b.id = c.b_id)  -- and here, nice and explicit.
    WHERE ... -- filter criteria go here.
    
  5. ==============================

    5.당신이 정렬 불일치를 처리하지 않으려면 정렬 물건을 감안할 때, 당신은 대신이 작업을 수행 할 수 있습니다 :

    당신이 정렬 불일치를 처리하지 않으려면 정렬 물건을 감안할 때, 당신은 대신이 작업을 수행 할 수 있습니다 :

    select sum(usercount) as usercount
    from (
        select count(*) as usercount from tbl1 where username = 'someuser'
        union all
        select count(*) as usercount from tbl2 where username = 'someuser'
        union all
        select count(*) as usercount from tbl3 where username = 'someuser'
    ) as usercounts
    

    0을 얻을 경우, 당신은 더 높은 무언가를 얻는 경우에,이, 그 이름을 가진 사용자가 없습니다.

    참고 : 삽입을 수행하는 방법에 따라, 당신은 이론적으로 인해 경쟁 조건 (정상화와 고유 키에 대해 다른 의견을 참조)과 동일한 이름을 가진 둘 이상의 사용자를 얻을 수 있습니다.

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

    6.RedFilter의 대답까지 현재 설정과 함께 잘 작동합니다. 나는 당신이 생각으로 시작하는 데이터베이스에 중복 또는 분산 된 데이터가없는 것을 지적 가치가있을 거라 생각 했어요.

    RedFilter의 대답까지 현재 설정과 함께 잘 작동합니다. 나는 당신이 생각으로 시작하는 데이터베이스에 중복 또는 분산 된 데이터가없는 것을 지적 가치가있을 거라 생각 했어요.

    당신의 경우에 너무 대신 3 개 개의 다른 테이블에서 사용자 이름을 가지고, 당신은 하나 개의 사용자 이름과 테이블과 그 사용자 이름에 대한 기본 키 식별자가 있어야합니다 - 당신은 오직 하나의 장소가 특정 데이터를 저장해야한다. 다른 3 개 테이블은 외래 키 참조 사용자 이름 테이블을 다음해야한다. 이 레이아웃을 훨씬 더 간단하고 효율적인 쿼리를 구성 할 수 있습니다. 당신은 다양한 위치에 데이터를 복제하여 벌레의 수를 여는 것입니다.

  7. from https://stackoverflow.com/questions/7232704/how-to-check-if-a-given-data-exists-in-multiple-tables-all-of-which-has-the-sam by cc-by-sa and MIT license