저는 SQLite로 작업하고 있으며 3 개의 테이블, 프로젝트, 송장 및 주문이 있습니다. 이 테이블에 저장된 필드를 선택하는 프로젝트 테이블을 기반으로하는 select 문이 있지만 특정 프로젝트에 대한 송장 합계 값과 특정 프로젝트에 대한 주문 합계 값도 원합니다. 모든 값을 개별적으로 가져 오는 방법을 알고 있지만 주문 / 송장의 합계 값을 프로젝트 데이터 행에 가져 오는 방법을 알아 내지 못했습니다. 검색해야하는 중첩 된 선택입니까, 아니면 다른 개념입니까?
프로젝트 테이블을 기준으로 선택
SELECT project.projectID, project.project_title, project.end_date, project.project_manager, project_status.project_status
FROM project
LEFT JOIN project_status
ON project.project_statusID=project_status.project_statusID
WHERE project.project_statusID BETWEEN 1 AND 12
x가 첫 번째 선택의 프로젝트 ID 인 송장 테이블을 기반으로 선택
SELECT sum(invoice_net)
FROM invoice
WHERE projectID= x
x가 첫 번째 선택의 프로젝트 ID 인 주문 테이블을 기반으로 선택하십시오.
SELECT sum(total_order)
FROM order
WHERE projectID = x
샘플 데이터를 제공하지 않았거나 필요한 정확한 SQL을 제공 할 수있는 충분한 DB 스키마를 제공하지 않았습니다.
송장이나 주문 테이블을 설명하지 않습니다. ProjectID 속성이 포함되어 있다고 가정해야합니다.
하위 선택을 사용할 수 있습니다.
http://www.techrepublic.com/article/use-sql-subselects-to-consolidate-queries/1045787/ https://msdn.microsoft.com/en-us/library/ff487138.aspx
선택 은 다음과 같이 보일 수 있습니다 .
SELECT
project.projectID,
project.project_title,
project.end_date,
project.project_manager,
project_status.project_status,
(SELECT sum(invoice.invoice_net) FROM invoice WHERE invoice.projectID = project.projectID),
(SELECT sum(order.total_order) FROM order WHERE order.projectID = project.projectID)
FROM project
LEFT JOIN project_status
ON project.project_statusID=project_status.project_statusID
WHERE project.project_statusID BETWEEN 1 AND 12
또는 그룹 기준으로 참여. 보다:
SQL JOIN, GROUP BY on three table to get totals
집계되지 않은 모든 항목 (일반적으로 프로젝트 테이블에서 선택한 모든 필드)별로 그룹화 한 다음 집계 함수 (합계)를 세부 속성 (invoice_net 및 total_order)에 적용해야합니다.
다음과 같이 (예상되지 않음) :
SELECT
project.projectID,
project.project_title,
project.end_date,
project.project_manager,
project_status.project_status,
sum(invoice.invoice_net),
sum(order.total_order)
FROM project
LEFT JOIN project_status
ON project.project_statusID=project_status.project_statusID
LEFT JOIN invoice
ON project.projectID = invoice.projectID
LEFT JOIN order
ON project.projectID = order.projectID
WHERE project.project_statusID BETWEEN 1 AND 12
GROUP BY project.projectID, project.project_title, project.end_date,
project.project_manager, project_status.project_status
무엇을 선택해야합니까? 성능 은 비슷 해야 하지만 쿼리 최적화 프로그램의 약점으로 인해 하나가 다른 하나보다 선호 될 수 있습니다. 이것이 중요한 경우 성능을 테스트하십시오.
일회성의 경우 조인 된 테이블의 뷰가 아직 존재하지 않는 경우 하위 선택을 사용합니다. 그러나 실제로 뷰가 존재하거나 존재해야합니다.이 경우 뷰를 사용하거나 필요한 경우 뷰를 만드는 것은 GROUP BY와 함께 매우 자연 스럽습니다.
따라서 실제 대답은 다음과 같습니다.
CREATE VIEW project_order_invoice AS
SELECT
project.projectID,
project.project_title,
project.end_date,
project.project_manager,
project_status.project_status,
invoice.invoice_net,
order.total_order
FROM project
LEFT JOIN project_status
ON project.project_statusID=project_status.project_statusID
LEFT JOIN invoice
ON project.projectID = invoice.projectID
LEFT JOIN order
ON project.projectID = order.projectID
SELECT
projectID,
project_title,
end_date,
project_manager,
project_status,
sum(invoice_net),
sum(total_order)
FROM project_order_invoice
WHERE project_statusID BETWEEN 1 AND 12
GROUP BY projectID, project_title, end_date,
project_manager, project_status
보기의 경우 ID 속성의 사본 1 개만 제외하고 모든 테이블의 모든 속성을 포함 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다