나는 책을 읽고 있는데, 여기서 저자는 한 행에 행 + 모든 연결된 부모 행을 가져 오는 것에 대해 이야기합니다. 주문을 가져 오는 것과 모든 항목을 한꺼번에 가져 오는 것과 같습니다. 좋아요, 근사하지만 실제로는 SQL에 대해 묻는 질문은 한 번도 없었습니다. 이 레코드 세트는 어떻게 생겼습니까? 하나의 행에 항목 필드에 많은 NULL 값이있는 반면, 100 행에 순서 필드에 대한 많은 NULL 값이있는 항목과 주문 테이블의 병합 된 필드가있는 101 개의 행을 얻을 수 있습니까? 그게 갈 길이야? 아니면 뭔가 더 시원합니까? 내 말은 ... 필드에 배열을 가져 오는 것에 대해 들어 본 적이 없다는 말입니까?개체 그래프를 한 번에 가져 오는 방법은 무엇입니까?
답변
간단한 트릭을 할 것 가입 :
SELECT o.*
, i.*
FROM orders o
INNER JOIN order_items i
ON o.id = i.order_id
(가) order_items의 각 행에 대해 한 행을 반환합니다. 반환 된 행은 orders 테이블의 모든 필드로 구성되며 order_items 테이블의 모든 필드에 연결됩니다 (문자 그대로 테이블의 레코드가 조인됩니다. 즉, 레코드 연결로 결합됩니다).
So 주문이 (id, order_date, customer_id)이고 order_items가 (order_id, product_id, price) 인 경우 위의 문의 결과는 (ID, 주문 _ 날짜, 고객 _ ID, 주문 _ ID, 제품 _ ID, 이 접근 방식은 하나의 '마스터'에 대해 두 개의 서로 다른 '세부 사항'테이블이있을 때마다 중단된다는 점을 알아야합니다. 설명하겠습니다.
orders/order_items 예에서 orders는 마스터이고 order_items는 세부 사항입니다. order_items의 각 행은 orders의 정확히 하나의 행에 속하거나 종속되어 있습니다. 그 반대는 사실이 아닙니다. orders 테이블의 한 행은 order_items 테이블에서 0 개 이상의 관련 행을 가질 수 있습니다. 조건에 가입
ON o.id = i.order_id
에만 관련 행이
(당신이 조건에 가입 생략 할 수 있도록 할 데이터베이스를 가정, 두 개의 테이블에서 행의 가능한 모든 조합을 retturn 할 조건을 떠나) 결합 및 반환 보장이제 두 개의 세부 정보가있는 마스터가 하나 있다고 가정합니다 (예 : customers는 master, customer_orders는 detail1 및 customer_phone_numbers). 모든 주문과 모든 전화 번호와 함께 특정 고객을 검색하려고한다고 가정합니다. 당신이 작성하는 유혹 될 수 있습니다 이것은 유효한 SQL이며, 그것을 실행합니다
SELECT c.*, o.*, p.*
FROM customers c
INNER JOIN customer_orders o
ON c.id = o.customer_id
INNER JOIN customer_phone_numbers p
ON c.id = p.customer_id
(테이블을 asuming 및 열 이름은 장소에) 그러나 문제는, 당신에게 쓰레기 결과를 줄 것입니다. 이 순서 1과 전화 사이에 어떤 관계가 암시 하듯이
customer-data | order 1 | phone A
customer-data | order 2 | phone A
customer-data | order 1 | phone B
customer-data | order 2 | phone B
이 쓰레기가있다 : 당신이 개 주문 (1,2) 및 두 개의 전화 번호와 고객에 미칠 가정 (A, B) 당신은이 기록을 얻을 숫자 A와 B, 주문 2, 전화 번호 A와 B가 포함됩니다.
이러한 결과는 데이터베이스 성능을 크게 상실하는 많은 수의 레코드에서 완전히 폭발 할 수 있습니다.
그래서 JOIN은 깊이가 알려진 항목의 계층 구조 (customer -> orders -> order_items)를 각 세부 항목의 마스터 항목 만 복제하는 하나의 큰 테이블로 "평평하게"우수합니다. 그러나 관련 항목의 실제 그래프를 추출하는 것은 끔찍합니다. 이는 SQL이 설계된 방식의 직접적인 결과입니다. 반복되는 그룹이 없어도 정규화 된 테이블 만 출력 할 수 있습니다. 이것은 프로그래머로서의 정신을 잃지 않고 여러 종속 오브젝트의 콜렉션을 저장하고 관계형 데이터베이스에서 검색 할 수있는 오브젝트 정의를 허용하기 위해 오브젝트 관계형 맵퍼가 존재하는 방식입니다.
이것은 일반적으로 JOIN 절을 통해 수행됩니다. 이렇게하면 많은 NULL 값이 생기지 않지만 상위 행에 대한 많은 반복 값이 생깁니다.
데이터베이스 및 프로그래밍 언어에서 지원하는 경우 다른 연결 옵션으로 두 결과 집합을 모두 반환 할 수 있습니다. 하나는 관련 행에 대해 다른 행을 선택합니다.
- 1. 개체 속성의 기본값을 가져 오는 방법은 무엇입니까?
- 2. 한 번에 가져 오는 대신 데이터를 작은 단위로 가져 오기
- 3. 한 번에 개체 조작 반복 또는 여러 개체 변경
- 4. 한 번에 여러 프로젝트의 변경 내용을 가져 오는 방법
- 5. document.getElementbyId - 한 번에 둘 이상의 ID를 가져 오는 중입니까?
- 6. 한 번에 여러 ID에서 사진과 이름을 가져 오는 방법
- 7. 결과 집합을 한 달에 한 번씩 가져 오는 방법은 무엇입니까?
- 8. Kohana 한 번에 모든 관계 가져 오기
- 9. myGeneration을 사용하여 BusinessEntity에서 개체 목록을 가져 오는 방법은 무엇입니까?
- 10. 개체 또는 클래스의 메서드 목록을 가져 오는 방법은 무엇입니까?
- 11. 양식의 필드 개체 모음을 가져 오는 방법은 무엇입니까?
- 12. 한 번에 로그인 수를 제한하는 방법은 무엇입니까?
- 13. 실행 균형을 한 번에 업데이트하는 방법은 무엇입니까?
- 14. 한 번에 여러 항목을 쿼리하는 방법은 무엇입니까?
- 15. 기존 개체 그래프를 중첩합니까?
- 16. 이메일을 가져 오는 방법은 무엇입니까?
- 17. PLActorKit을 가져 오는 방법은 무엇입니까?
- 18. Entity Framework 개체 그래프를 메모리에 유지하는 가장 좋은 방법은 무엇입니까?
- 19. ListView에서 전체 개체를 가져 오는 방법은 무엇입니까?
- 20. 한 번에 두 번 버튼으로 한 번에
- 21. 한 클래스에서 다른 클래스로 변수를 가져 오는 방법은 무엇입니까?
- 22. 한 테이블에서 중복 데이터 만 가져 오는 방법은 무엇입니까?
- 23. 임시 테이블에서 한 번에 n 개의 레코드 가져 오기
- 24. 그래프를 직렬화하는 방법은 무엇입니까?
- 25. jsf에서 그래프를 만드는 방법은 무엇입니까?
- 26. 한 번에
- 27. 다른 사이트에서 ID를 가져 오는 방법은 무엇입니까?
- 28. 포럼 스레드에서 데이터를 가져 오는 방법은 무엇입니까?
- 29. 코코아에서 입력 개체 가져 오는 중 ... 더 나은 스타일이란 무엇입니까?
- 30. 웹 사이트에서 데이터를 가져 오는 방법은 무엇입니까?