2016-08-02 5 views
1

MSSQL 데이터베이스에서 일부 데이터를 가져옵니다. 이 데이터에서 나는 클라이언트 항목을 만든 사람과이 클라이언트에서 첫 번째 지불을 한 사람을 결정하려고합니다.쿼리 결과가 너무 많습니다.

하나의 예약/조회에 대해 많은 지불 항목이있을 수 있으며 현재 나의 지불은 각 지불에 대한 결과를 보여줍니다. 첫 번째 지불 항목 만 표시하도록 출력을 제한하려면 어떻게합니까?

내 쿼리 : 나는 PaymentUser에 대한 중첩 된 SELECT 문에 "TOP 1"을 추가했는데,이 차이를하지

SELECT 
c.FirstName, 
c.LastName, 
c.PostalCode, 
o.OriginOfEnquiry, 
s.SuperOriginName, 
c.DateOfCreation, 
DATEDIFF(day, c.DateOfCreation, p.DateOfCreation) AS DaysToPayment, 
pc.PackageName, 
CONCAT(u.FirstName, ' ', u.LastName) AS CreateUser, 
(SELECT CONCAT(u.FirstName, ' ', u.LastName) 
    WHERE u.UserID = p.UserID) AS PaymentUser 

FROM tblBookings b 

INNER JOIN tblPayments p 
ON b.BookingID = p.BookingID 
INNER JOIN tblEnquiries e 
ON e.EnquiryID = b.EnquiryID 
INNER JOIN tblCustomers c 
ON c.CustomerID = e.CustomerID 
INNER JOIN tblOrigins o 
ON o.OriginID = e.OriginID 
INNER JOIN tblSuperOrigins s 
ON s.SuperOriginID = o.SuperOriginID 
INNER JOIN tblBookingPackages bp 
ON bp.bookingID = p.BookingID 
INNER JOIN tblPackages pc 
ON pc.PackageID = bp.packageID 
INNER JOIN tblUsers u 
ON u.UserID = c.UserID 

WHERE c.DateOfCreation >= '2016-06-01' AND c.DateOfCreation < '2016-06-30' 
AND p.PaymentStatusID IN (1,2) 
AND e.CustomerID = c.CustomerID 
AND p.DeleteMark != 1 
AND c.DeleteMark != 1 
AND b.DeleteMark != 1 
; 

.

+2

여기서부터 시작하는 것이 좋습니다. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+1

'top 1'과 함께'cross apply'를 사용할 수 있습니다 :'FROM tblBookings b 교차 적용 (tblPayments p에서 b.BookingID = p.BookingID의 상단 1 *을 선택하십시오.) ' –

+0

여러 테이블이 포함 된 질문을 할 때 사용할 수있는 또 다른 유용한 도구가 있습니다. http://sqlfiddle.com/. 스키마와 데이터를 알지 못하면 초기 선택에 'TOP 1'을 넣고 전체 쿼리를'c.DateOfCreation'으로 정렬합니다. – squillman

답변

0

사용할 수 cross apply :

대신 테이블 tblPayments이 같은 하위 쿼리를 지정의
FROM tblBookings b 

INNER JOIN tblPayments p ON p.ID = (
    SELECT TOP 1 ID 
    FROM tblPayments 
    WHERE BookingID = b.BookingID 
    AND DeleteMark != 1 
    AND PaymentStatusID IN (1,2) 
    ORDER BY DateOfCreation) 
+0

고마워,이게 나를 위해 일했다 – Stephen

+1

@stephen - "첫 번째"지불이 필요한 경우,이 답변의 "최고 1"지급액과 동일하지 않습니다. FWIW. – Chains

-2

tblPayments에는 기본 키 열 ID이 있다고 가정합니다. top 1

(SELECT TOP 1 BookingID, UserID, DateOfCreation 
FROM tblPayments 
WHERE DeleteMark != 1 
AND PaymentStatusID IN (1,2) 
ORDER BY DateOfCreation) as p 
+1

이 코드는 여전히 중복을 일으킬 것이라고 생각합니다. 문제는 당신이 가진 첫 번째 합류에 있습니다. –

+0

나는 너에게 동의하지 않는다. PK에 의해 제한된 첫 번째 JOIN 결과. –

0

: 그것이 사실이라면, 당신은이 한 Statment을 사용할 수 있습니다

FROM tblBookings b cross apply (select top 1 * from tblPayments p where b.BookingID = p.BookingID) as p