2016-09-26 3 views
0

복잡한 문제가 발생했습니다. 데이터베이스의 데이터에는 세 개의 테이블이 있습니다.

i가 전체 외주를 사용해야 First_DB하나의 db의 다른 테이블 데이터를 다른 db의 단일 테이블에 삽입하십시오.

-- default_users 
id username email  password 
1 Timbog [email protected] vads7y3kkjdfa 
2 Marta [email protected] vads7y3kkjdfa 

-- default_album 
album_id album_name default_user_id 
    1  Name_Tim  1 
    3  Katarina  2 
-- default_album_img 
img_id  image_file album_id 
    3  1320229733.jpg  1 
    4  3320229733.jpg  3 

Second_DB

--users 
user_id user_name  user_email  user_pass  user_image 
    1  Timbog [email protected] vads7y3kkjdfa 1320229733.jpg 
    2  Marta  [email protected] vads7y3kkjdfa 3320229733.jpg 

제가 내부 조인함으로써이 문제는 모든 데이터를 페치들을 해결하기 위해 사용되는 방식은 가입 삽입 필수 필드를 내 테이블에, 다음 쿼리를 실제에 의해 그것을 wor 만들기 위해 노력하고있어.

INSERT INTO bbpin.users (user_name, user_pin, user_email, user_password, user_img) 
SELECT default_users.username, default_users.bb_pin, default_users.email, default_users.password 
FROM bbmpins_pins.default_users 
INNER JOIN bbmpins_pins.default_album_images 
ON default_album_images.album_id = default_users.id; 

나는이 결부에서 아마도 두 테이블의 ID를 어떻게 비교할 수 있을까? 또는이 쿼리는 접근 방식 모두 잘못 되었습니까? First_DB에서 sepearte 인 두 테이블에 의해 다중 레코드가있을 수 있습니다. 어떻게 마지막 엔트리로 트렁크를 꽂을 수 있습니까? 감사

답변

1

그것은처럼 보이는 관계 테이블을 가입해야합니다 default_users 테이블에서 모든 행을 검색하려고 시도하고 있습니다. 각 행과 함께 default_album 테이블에서 해당 행을 반환합니다. 그리고 그것과 함께 대응하는 행은 default_album_img 표입니다.

SELECT u.id    AS user_id 
     , u.username  AS user_name 
     , u.email   AS user_email 
     , u.password  AS user_pass 
     , i.image_file  AS user_image 
    FROM default_users u 
    JOIN default_album a 
    ON a.default_user_id = u.id 
    JOIN default_album_img i 
    ON i.album_id = a.album_id 

즉, 쿼리 예제 데이터를 작동합니다 : 예제 데이터를 감안할 때

, 내부 사용하여 쿼리가 지정된 결과를 반환 결합한다.

그러나, default_album에 일치하는 행이없는 default_user의 행이있는 경우, 다음 내부 해당 행 반환하지 않습니다 조인 두 개 이상있을 경우,

-- default_users 
id username email   password 
3 branstark [email protected] warg2 

또는 특정 사용자와 일치 default_album 행이, 다음 쿼리는 이러한 경우에 반환하는 것입니다 무엇을 사양하지 않고 default_user에서 행의 두 복사본 ...

-- default_album 
album_id album_name default_user_id 
    1  Tim2   1 

를 반환합니다, 우리는을 권장하지 않습니다 질문.

+0

또는 하나씩 수행 할 수 있습니다. patty 접근 방식은 충돌하는 테이블없이 한 테이블에서 다른 테이블로 모든 데이터를 삽입합니다. 완료되면 완료된 fk를 앨범 키와 함께 삽입하고 여러 값을 처리해야합니다. –

+0

고유 키로 사용자 테이블의 기본 키를 제거하면 어떻게됩니까? 할 수 있을까요? –

+0

쿼리가 실제로 무엇을 시도하는지에 달려 있습니다. 내부 조인 쿼리가 "누락 된"행 또는 "중복 된"행을 갖는 집합을 생성하면이를 처리 할 수 ​​있습니다. "누락 된"행을 피하기 위해 OUTER 조인을 사용하거나 SELECT 목록에서 상관 된 하위 쿼리를 사용하여 조인을 피할 수 있습니다. "중복"행을 피하기 위해 GROUP BY 및 집계 식 또는 SELECT 목록의 상관 하위 쿼리를 사용할 수 있습니다. 그것은 정말로 당신이 돌아가고 싶은 결과에 달려 있습니다. – spencer7593

1

나는 JOIN을 사용하여 현재의 접근 방식과 아무 잘못 표시되지 않습니다하지만 더 읽을 수 있도록 그것을 조금 수정할 수 있으며, 또한

INSERT INTO bbpin.users (user_id, user_name, user_pin, user_email, user_password, user_img) 
SELECT du.id, 
du.username, 
du.bb_pin, 
du.email, 
du.password, 
dai.image_file 
FROM bbmpins_pins.default_users du 
JOIN bbmpins_pins.default_album da ON du.id = da.default_user_id 
INNER JOIN bbmpins_pins.default_album_images dai 
ON dai.album_id = da.album_id; 
+0

우리가 세 번째 테이블에서 이미지 값을 가져와야하므로 즉시 카운트 오류가 발생합니다. –

+0

@HabibRehman, 도움이 될 경우 답변을 편집하십시오. – Rahul

+0

동일한 오류, 열 개수가 값 개수와 일치하지 않습니다. 나는 사용자가 앨범을 여러 번 삽입 할 수 있었을 것이라고 생각하는데, 아마도 그게 문제일까요? –

관련 문제