복붙노트

[SQL] 어떻게 SQL이 잘못 될 수 있는가? 나는 무엇을보고 있지 않다?

SQL

어떻게 SQL이 잘못 될 수 있는가? 나는 무엇을보고 있지 않다?

누군가가 내 오류를 발견시겠습니까,이는 SQL의 법적 쿼리해야하지 있어야한다?

이 데이터베이스 스키마입니다 :

User: (usr_auto_key, name, etc...)
Setting: (set_auto_key, name etc..)
User_Setting: (usr_auto_key, set_auto_key, value)

그리고이 쿼리는 ...

        SELECT 
        `u`.`usr_auto_key` AS `u__usr_auto_key`, 
        `s`.`set_auto_key` AS `s__set_auto_key`, 
        `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
        `u2`.`set_auto_key` AS `u2__set_auto_key`, 
        `u2`.`value` AS `u2__value` 
        FROM `User` `u`, `Setting` `s` 
        LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
        WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)

해결법

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

    1.절에서의 사용자 및 설정을 전환하십시오 :

    절에서의 사용자 및 설정을 전환하십시오 :

    SELECT 
            `u`.`usr_auto_key` AS `u__usr_auto_key`, 
            `s`.`set_auto_key` AS `s__set_auto_key`, 
            `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
            `u2`.`set_auto_key` AS `u2__set_auto_key`, 
            `u2`.`value` AS `u2__value` 
            FROM `Setting` `s`, `Users` `u`
            LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
            WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)
    
  2. ==============================

    2.SQL-89 "쉼표 스타일"을 혼합하지 마십시오과 조인 구문을 SQL-92 구문 가입하세요. 가입 작업의 두 가지 유형의 우선 순위와 미묘한 문제가 있습니다.

    SQL-89 "쉼표 스타일"을 혼합하지 마십시오과 조인 구문을 SQL-92 구문 가입하세요. 가입 작업의 두 가지 유형의 우선 순위와 미묘한 문제가 있습니다.

    귀하의 경우, 결과는이 U 테이블 별칭이 존재하기 전에 조건 좌 조인 평가하는 점이다. 이 u.usr_auto_key이 무엇인지 모르는 이유입니다.

    당신은 모든 조인 (join) 구문을 가입 사용하여이 문제를 해결할 수 있습니다 :

    SELECT 
      `u`.`usr_auto_key` AS `u__usr_auto_key`, 
      `s`.`set_auto_key` AS `s__set_auto_key`, 
      `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
      `u2`.`set_auto_key` AS `u2__set_auto_key`, 
      `u2`.`value` AS `u2__value` 
    FROM `User` `u` JOIN `Setting` `s`
    LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
    WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)
    

    나는 당신이이 데카르트 제품이 될하고자하는 가정, 그래서 나는 어떤 조회에서 u와의 사이에 조인 조건을 참조하지 않았다?

    가입에 대한 두 가지 구문 형태 사이의 상호 작용에 대한 자세한 내용은 섹션 페이지에서 MySQL 5.0.12에서 처리 변경 가입을 참조하십시오 http://dev.mysql.com/doc/refman/5.0/en/join.html

    귀하의 코멘트 제목 : Re : 내가 말했듯이, 그것은 연산자 우선 순위와 관련이있다. 당신은 FROM와 SQL 쿼리가있는 경우, B는 C가 다음이 B를 평가 가입 그것은 어떤 관심을 지불하기 전에 C를 가입 - 테이블 별칭을 할당하는 단계를 포함하는. B에 대한 조인 조건이 가입한다면 C는 별명이 아직 존재하지 않기 때문에 오류가 발생하는 A의 테이블 별칭을 사용합니다.

    당신이 그것을하고 실행은 B를 반대하는 경우는이 별명이 가능하며이 (적어도이 경우) 작동 C를 조인 조인 조건을 평가할 때, A는 다음 C 가입하세요.

    당신은 또한 A와 B 그것의 더 오래된를 사용하여 단지 정류장은 쉼표로 조인 구문을 재정렬 것만으로 해결 될 수없는 쿼리를해야 할 수도 있기 때문에 그러나 이것은, 깨지기 쉬운 솔루션입니다. 다음 표현식은 모든 테이블 별칭에 대한 액세스 권한이 가입하고 당신은 어떤 쿼리에서이 문제가 없을거야.

  3. from https://stackoverflow.com/questions/2660497/how-can-this-sql-be-wrong-what-am-i-not-seeing by cc-by-sa and MIT license