查询结果太多

时间:2016-08-02 13:50:18

标签: sql sql-server

我从MSSQL中的数据库中获取一些数据。在这些数据中,我想确定谁创建了客户端条目以及谁从该客户端获得了第一笔付款。

在一次预订/查询中,客户可以有许多付款条目,目前,我的查询显示每笔付款的结果。如何限制输出仅显示第一个付款条目?

我的查询:

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
;

我尝试添加&#34; TOP 1&#34;对于PaymentUser的嵌套select语句,但没有区别。

3 个答案:

答案 0 :(得分:0)

而不是表tblPayments指定子查询,如下所示:

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

答案 1 :(得分:0)

您可以cross apply使用top 1

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

答案 2 :(得分:-2)

我假设>Toad.exe "C:\My Scripts\MyFile.sql"有一个主键列tblPayments。如果是,您可以使用此语句:

ID