简体   繁体   English

查询结果过多

[英]Too many results in query

I'm fetching some data from our database in MSSQL. 我正在从MSSQL数据库中获取一些数据。 Out of this data I want to determine who created the client entry and who took the first payment from this client. 根据这些数据,我想确定是谁创建了客户条目,以及谁从该客户那里收取了第一笔款项。

There can be many payment entries for a client on a single booking/enquiry and at the moment, my query shows results for each payment. 单个预订/查询上可以有许多客户付款项,此刻,我的查询显示了每次付款的结果。 How can I limit the output to only show the first payment entry? 如何限制输出以仅显示第一个付款条目?

My query: 我的查询:

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
;

I tried adding a "TOP 1" to the nested select statement for PaymentUser, but it made no difference. 我尝试将“ TOP 1”添加到PaymentUser的嵌套选择语句中,但是没有区别。

Instead of table tblPayments specify sub-query like this: 代替表tblPayments指定子查询,如下所示:

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

您可以与top 1 cross apply

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

I'm assuming that tblPayments has a primary key column ID . 我假设tblPayments有一个主键列ID If it is true, you can use this statment: 如果为真,则可以使用以下语句:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM