2017-12-19 4 views
0

저는 SQLSqlite을 처음 접했습니다. 그렇지만이 학문적 인 이유 때문에 내가 직접 만든 더러운 데이터베이스로 기초를 배우려고 노력하는 중입니다. . 어휘가 정확하지 않으면 용서해주십시오. 나는 여전히 학습 과정에 있습니다.SQLite : 동일한 외래 키를 공유하는 모든 항목을 선택하십시오

각기 다른 종류의 엔티티로 각각의 테이블 세트를 만들었지 만 비슷한 점이 있습니다 : 서로 다른 값을 갖는 동일한 Foreign Key의 여러 오리지널을 공유합니다.

표 M1 : 2 개 항목 엔티티 모든 이전 데이터 열이 Unique Key 이하 (표 N)에 Foreign Keys있다

+------------+---------+--------+-------+-------+ 
Primary Key Unique ID Data1 Data2 Data3 
+------------+---------+--------+-------+-------+ 
     1   y1  103021 103022 103001   

:

+------------+---------+--------+-------+ 
Primary Key Unique ID Data1 Data2 
+------------+---------+--------+-------+ 
     1   x1  103021 103022  

표 M2 : 3 개 항목 엔터티

+------------+---------+--------+-------+ 
Primary Key Unique ID Data1 Data2 
+------------+---------+--------+-------+ 
     1   100002  ...  ... 
     2   103001  ...  ... 
     3   103021  ...  ... 
     4   103022  ...  ... 

내가해야하는 일은 다음을 공유하는 모든 엔티티를 추출하는 것입니다. 주어진 고유 항목 (My Foreign Key). 예를 들어 103022 두 엔티티가 부여됩니다 : x1y1.

저는 며칠 동안 노력해 왔으며 JOIN 문과 함께 필요한 정보를 얻을 수있었습니다.

INNER 가입 :

SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id 

CROSS이 가입 :

SELECT N.id, T1.id FROM N CROSS JOIN M1 as T1 WHERE T1.data1=N.id OR T1.data2=N.id 

내가 시간과 파이썬 실시간으로 사후 처리를에서 하나 개의 테이블을 할 경우 INNER JOIN에만 작동합니다, 나는 이해 CROSS JOIN은 내 데이터의 데카르트 생성물을 생성하고 다른 테이블과 부울 조건을 추가 할 때 너무 많은 메모리를 쉽게 사용할 수 있습니다. 그래서 나는 그것이 선택 사항이 아니라고 생각합니다.

내가 생각하지 못한 다른 방법이 있습니까?

감사합니다.

+1

원하는 출력을 알 수 있습니까? –

+0

1. M1, M2 & N 또는 원하는 출력물에 대한 텍스트가 명확하지 않습니다. 명확하게 설명하기에 충분한 문장을 사용하십시오. [mcve]에 읽고 읽습니다. 어떤 열이 FK인지 다른 열에 정확히 알려주십시오. 2. 구현에 대한 오해가 있습니다. 이 두 조인은 모든 실제 DBMS에서 동일한 방식으로 구현됩니다. https://stackoverflow.com/q/44917/3404097 또한, 구현의 최적화에 대해 걱정하기 전에 쿼리의 일부가 의미하는 것과 직접적인 쿼리를 작성하는 방법에 대해 더 많이 배워야합니다. – philipxy

+0

@philipxy : 우선, 나는 비판 할 필요가없고 배울 점을 분명히했다. 내 질문에 귀하의 모든 의문에 대한 답변을 쉽게 찾을 수있는 반면 귀하의 링크를 읽었습니다. 그것은별로 도움이되지 않습니다. 반면에 INNER와 CROSS Join이 동일한 효과를 나타낼 수는 없지만 CROSS join을 사용하면 프로세스가 중단 될 수 있습니다. – Chang

답변

1

난 당신이

SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id 
Union 
SELECT N.id, T1.id FROM N INNER JOIN M2 as T1 on T1.data1=N.id OR T1.data2=N.id 

테이블

Union를 찾고 있습니다 생각 참고 : 기본 테이블과 M1으로 N을 고려, M2는 당신이 가입하려는 다른 테이블입니다.

+0

감사합니다. 작동합니다. 이것이 가장 효율적인 방법입니까? – Chang

+0

@Chang - 환영합니다. 다른 테이블에서 원한다면이게 내가 아는 방법이고 다른 방법은 없습니다. 추측 해보세요/작동 시키거나 도움이된다면 upvote하세요. –

관련 문제