2014-06-18 3 views
0

나는이 검색을 시도하지만 내 Vocab의가 작업까지했다 확실하지 않다 . 하나의 테이블을 쉽게 가짜로 만들어서 스키마 차이를 처리 할 수는 있지만, 첫 번째 테이블의 정보를 기반으로 두 번째 테이블의 행 부분 집합 만 원한다는 것이 중요합니다. 내 마지막 수단은 저장된 proc 및 임시 테이블을 만들고 있지만 쿼리를 사용하여이 작업을 수행 할 수 있는지 궁금합니다. 이MySQL에서는 UNION으로 SELECT 할 수 있지만 첫 번째 쿼리를 기반으로 두 번째 쿼리의 행을 제한 할 수 있습니까? 내가 다른 스키마와 테이블에서 나는 하나 개의 쿼리 (나쁜 소프트웨어)에 결합해야 두 개의 테이블을 가지고</p> <p>...

의 MySQL 5.5에 내가 좋아하는 뭔가를 말 :

Cats   BadCats 
----   ------- 
id    cat_id 
name   color 
weight   badness 
length 
color 
awesomeness 

나는 파란색 결과 집합에있는 고양이에 대한 모든 블루 고양이 나쁜 고양이의 값을 선택합니다. 마찬가지로 :

SELECT id,name,awesomeness from Cats where color = 'blue' 
UNION 
SELECT cat_id,null,badness from BadCats 
    where BadCats.cat_id = Cats.id 
    and BadCats.color = 'blue' -- or BadCats.color = Cats.color 

나는 것 할 싶은 것의 또 다른 인위적인 예 :

SELECT id,name from Cats c JOIN BadCats bc on bc.cat_id=c.id 

그러나 가짜 BadCat의 열 어떻게 든 작동 것이다 조인 있도록. 잠재적

CREATE TABLE temp 
SELECT id,name,awesomeness from Cats where color = 'blue' INTO temp 
SELECT cat_id,null,badness from BadCats where cat_id in (select distinct id from Cats) INTO temp 
return * from temp 

또는 :

CREATE TABLE temp 
SELECT cat_id,null,badness from BadCats INTO temp -- same schema 
SELECT id,name,awesomeness from Cats LEFT JOIN BadCats on id=cat_id 
    where Cats.color = 'blue' 

또는 더 많은 잠재적 고양이 같은 스키마 BadCats에보기 ...

최종 목표 내 저장된 프로 시저가 같을 것 여기에 발견 된 고양이와 일치하는 BadCats에 행을 포함 시켜서 얼마나 멋지고/나빴는지에 대한 아이디어가있는 파란색 고양이 목록을 얻는 것이므로 소프트웨어는 ID를 기반으로 행을 처리 할 수 ​​있습니다.

+1

스키마가 전혀 이해가 안됩니다. 왜 나쁜 고양이가 나빠질까요? 고양이 테이블에있는 재산 (칼럼)이 왜 나쁜 것입니까? –

답변

1

이것은 달성하려는 것입니까?

SELECT id,name,awesomeness from Cats where color = 'blue' 

UNION 

SELECT cat_id,null,badness from BadCats 
    where cat_id in 
    (SELECT id from Cats where color = 'blue') 
    and color = 'blue 
+1

저는 실제로 올바른 질문을하지 않았지만, 이것은 제가 원래 찾고 있었던 대답입니다. 감사. :) – Josh

0

내가 100 % 물어 본 내용을 이해했다면 거짓말을하고, UNION 구문에는 익숙하지 않지만, 내가 읽은 바로는 다음과 비슷한 것을 할 수 있어야한다고 생각합니다.

SELECT c.* FROM Cats as c WHERE c.color="blue" 
UNION 
SELECT bc.* FROM BadCats as bc WHERE bc.cat_id = c.id 

여기에 더 많은 정보를 얻을 수있는 W3Schools Article On Left Join이 있습니다. 마찬가지로, 오른쪽 조인 (Join) 및 내부 조인 (Inner Join)이 있습니다. 나는 완전히 당신이 뭘 하려는지 오해하지 않는 한, 생각

, 당신은

SELECT c.*,bc.* FROM Cats as c, BadCats as bc WHERE c.color="blue" and bc.cat_id = c.id 

처럼 많은 일을하기를 원할 것입니다하지만 명시된 바와 같이, 당신이 무슨 말을 하려는지에 100 % 아니에요 달성하기 위해 또는 UNION의 장점이 정확히 무엇입니까

1

이것은 UNION 일 필요는 없습니다. 이것은 단순히 외부 조인입니다.

SELECT id, name from Cats c 
LEFT OUTER JOIN BadCats bc on bc.cat_id=c.id 
WHERE c.color = 'blue' 

일치하는 bc.cat_id가 있든 없든 고양이에게서 파란색 고양이를 모두 얻습니다.

BadCats에 동일한 ID가있는 일치하는 행이 있으면 결합됩니다.
주어진 cat에 대해 일치하는 잘못된 cat이 없으면 BadCats의 모든 열이 NULL로 "위장"됩니다.

조인 유형에 대한 자세한 내용은 http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/을 참조하십시오. 그것들을 사용하는 법을 배우는 것은 시간이 걸릴 것입니다.

+0

이 질문에 대한 대답은 잘못되었습니다. (추가 행이 필요했습니다.)하지만, 잘못된 질문을하거나 잘못된 길을 찾고 있다는 사실을 알게되었습니다. 궁극적으로이 문제는 저의 문제를 해결하는 데 90 %의 길을 잡았습니다. . 고맙습니다. – Josh