此视图正常。它在一份报告建筑物向导谈论一个SQLServer 2008 R2选择使用UNION returing duplicates
CREATE view vwQry_LicencePayments
as
select
P.*,
LT.LicenceTypeDesc, FT.FeeTypeDesc, FT.ThroughputText, FT.Prorata as IsProrata, PT.PaymentStatusDesc, PT.IsPaid,
E.EntityType as HolderEntityType, E.EntityTypeDesc as HolderEntityTypeDesc, E.PersonTitle, E.PersonFirstname, E.PersonSurname,
E.OrganisationName, E.FullName as HolderFullName,
E.MailAddress as HolderMailAddress, E.Suburb as HolderSuburb, E.State as HolderState, E.Postcode as HolderPostcode,
E.Mobile as HolderMobile, E.Email, E.PFN as HolderPFN
from
rptPayment P
inner join vwQry_xhsEntity_Base E on P.HolderHistoryID = E.HistoryID
inner join LicenceType LT on P.LicenceTypeID=LT.LicenceTypeID
inner join LicenceFeeType FT on P.FeeTypeID=FT.FeeTypeID
inner join PaymentStatusType PT on P.PaymentStatusID = PT.PaymentStatusID
union ALL
select
P.*,
LT.LicenceTypeDesc, FT.FeeTypeDesc, FT.ThroughputText, FT.Prorata as IsProrata, PT.PaymentStatusDesc, PT.IsPaid,
E.EntityType as HolderEntityType, E.EntityTypeDesc as HolderEntityTypeDesc, E.PersonTitle, E.PersonFirstname, E.PersonSurname,
E.OrganisationName, E.FullName as HolderFullName,
E.MailAddress as HolderMailAddress, E.Suburb as HolderSuburb, E.State as HolderState, E.Postcode as HolderPostcode,
E.Mobile as HolderMobile, E.Email, E.PFN as HolderPFN
from
(select * from rptPayment where HolderHistoryID is null) P
inner join vwQry_Entity E on P.HolderID = E.EntityID
inner join LicenceType LT on P.LicenceTypeID=LT.LicenceTypeID
inner join LicenceFeeType FT on P.FeeTypeID=FT.FeeTypeID
inner join PaymentStatusType PT on P.PaymentStatusID = PT.PaymentStatusID
一个要求,包括支付日期(LP.dateTimeStamp)使用了上来。因此,添加额外字段(LP.dateTimeStamp)和两个联接(licenceFeePayment tble和licencePayment tble)必然会在结果集中造成重复。我假设,例如,如果已经通过三次独立付款支付了许可证,它将在licencefeePayment表中有三个记录。他们改变我做的是:
CREATE view vwQry_LicencePayments
as
select
P.*,
LT.LicenceTypeDesc, FT.FeeTypeDesc, FT.ThroughputText, FT.Prorata as IsProrata, PT.PaymentStatusDesc, PT.IsPaid,
E.EntityType as HolderEntityType, E.EntityTypeDesc as HolderEntityTypeDesc, E.PersonTitle, E.PersonFirstname, E.PersonSurname,
E.OrganisationName, E.FullName as HolderFullName,
E.MailAddress as HolderMailAddress, E.Suburb as HolderSuburb, E.State as HolderState, E.Postcode as HolderPostcode,
E.Mobile as HolderMobile, E.Email, E.PFN as HolderPFN, LP.DatetimeStamp AS DatetimeStamp
from
rptPayment P
inner join vwQry_xhsEntity_Base E on P.HolderHistoryID = E.HistoryID
inner join LicenceType LT on P.LicenceTypeID=LT.LicenceTypeID
inner join LicenceFeeType FT on P.FeeTypeID=FT.FeeTypeID
inner join PaymentStatusType PT on P.PaymentStatusID = PT.PaymentStatusID
inner join licenceFeePayment LFP on P.licenceID = LFP.licenceID
inner join licencePayment LP on LFP.paymentID = LP.paymentID
union ALL
select
P.*,
LT.LicenceTypeDesc, FT.FeeTypeDesc, FT.ThroughputText, FT.Prorata as IsProrata, PT.PaymentStatusDesc, PT.IsPaid,
E.EntityType as HolderEntityType, E.EntityTypeDesc as HolderEntityTypeDesc, E.PersonTitle, E.PersonFirstname, E.PersonSurname,
E.OrganisationName, E.FullName as HolderFullName,
E.MailAddress as HolderMailAddress, E.Suburb as HolderSuburb, E.State as HolderState, E.Postcode as HolderPostcode,
E.Mobile as HolderMobile, E.Email, E.PFN as HolderPFN, LP.DatetimeStamp AS DatetimeStamp
from
(select * from rptPayment where HolderHistoryID is null) P
inner join vwQry_Entity E on P.HolderID = E.EntityID
inner join LicenceType LT on P.LicenceTypeID=LT.LicenceTypeID
inner join LicenceFeeType FT on P.FeeTypeID=FT.FeeTypeID
inner join PaymentStatusType PT on P.PaymentStatusID = PT.PaymentStatusID
inner join licenceFeePayment LFP on P.licenceID = LFP.licenceID
inner join licencePayment LP on LFP.paymentID = LP.paymentID
帮助将非常感激。我如何加入这两张表并避免重复?
正如@注册用户指出的,虽然我已经这样做了,但并不像从我的UNION中删除ALL那么简单。
@注册用户感谢您的回复。我根据你的帮助对查询进行了更改,现在又有了一个小问题。我添加了一个来自'paymentType'表的名为'PaymentTypeDesc'的字段。由于此表通过“LicencePayment”加入,因此我必须将其置于您的子查询中。我仍然得到一些重复,因为我现在认为,不仅可以多次付款的许可证,他们可以来自多个不同的来源EG EFTPOS,现金等...
我怎样才能迎合不仅多个支付交易还有多种付款方式?这是我改变工作查询中使用你的帮助后:
CREATE view vwQry_LicencePaymentsNew
as
select
P.*,
LT.LicenceTypeDesc, FT.FeeTypeDesc, FT.ThroughputText, FT.Prorata as IsProrata, PT.PaymentStatusDesc, PT.IsPaid,
E.EntityType as HolderEntityType, E.EntityTypeDesc as HolderEntityTypeDesc, E.PersonTitle, E.PersonFirstname, E.PersonSurname,
E.OrganisationName, E.FullName as HolderFullName,
E.MailAddress as HolderMailAddress, E.Suburb as HolderSuburb, E.State as HolderState, E.Postcode as HolderPostcode,
E.Mobile as HolderMobile, E.Email, E.PFN as HolderPFN
, lic.VehicleRegNo as VehicleRegNo
, payment.PaymentTypeDesc as PaymentTypeDesc
, S.StatusTypeDesc as StatusTypeDesc
, Payment.LastPaymentDate as DatetimeStamp
-- , Payment.FirstPaymentDate
from
rptPayment P
inner join vwQry_xhsEntity_Base E on P.HolderHistoryID = E.HistoryID
inner join LicenceType LT on P.LicenceTypeID=LT.LicenceTypeID
inner join LicenceFeeType FT on P.FeeTypeID=FT.FeeTypeID
inner join PaymentStatusType PT on P.PaymentStatusID = PT.PaymentStatusID
inner join licence Lic on P.licenceID = lic.licenceID
inner join vwLicCurrentStatus S on P.LicenceID=S.LicenceID
inner join
(SELECT LFP.licenceID
, FirstPaymentDate = MIN(LP.DatetimeStamp)
, LastPaymentDate = MAX(LP.DatetimeStamp)
, PType.PaymentTypeDesc
FROM licenceFeePayment LFP
INNER JOIN licencePayment LP
on LFP.paymentID = LP.paymentID
INNER JOIN paymentType PType
on LP.paymentTypeID = PType.paymentTypeID
GROUP BY lfp.licenceID, PType.PaymentTypeDesc) Payment
ON P.licenceID = Payment.licenceID
union
select
P.*,
LT.LicenceTypeDesc, FT.FeeTypeDesc, FT.ThroughputText, FT.Prorata as IsProrata, PT.PaymentStatusDesc, PT.IsPaid,
E.EntityType as HolderEntityType, E.EntityTypeDesc as HolderEntityTypeDesc, E.PersonTitle, E.PersonFirstname, E.PersonSurname,
E.OrganisationName, E.FullName as HolderFullName,
E.MailAddress as HolderMailAddress, E.Suburb as HolderSuburb, E.State as HolderState, E.Postcode as HolderPostcode,
E.Mobile as HolderMobile, E.Email, E.PFN as HolderPFN
, lic.VehicleRegNo as VehicleRegNo
, payment.PaymentTypeDesc as PaymentTypeDesc
, S.StatusTypeDesc as StatusTypeDesc
, Payment.LastPaymentDate as DatetimeStamp
-- , Payment.FirstPaymentDate
from rptPayment P
inner join vwQry_xhsEntity_Base E on P.HolderHistoryID = E.HistoryID
inner join LicenceType LT on P.LicenceTypeID=LT.LicenceTypeID
inner join LicenceFeeType FT on P.FeeTypeID=FT.FeeTypeID
inner join PaymentStatusType PT on P.PaymentStatusID = PT.PaymentStatusID
inner join licence Lic on P.licenceID = lic.licenceID
inner join vwLicCurrentStatus S on P.LicenceID=S.LicenceID
inner join
(SELECT LFP.licenceID
, FirstPaymentDate = MIN(LP.DatetimeStamp)
, LastPaymentDate = MAX(LP.DatetimeStamp)
, PType.PaymentTypeDesc
FROM licenceFeePayment LFP
INNER JOIN licencePayment LP
on LFP.paymentID = LP.paymentID
INNER JOIN paymentType PType
on LP.paymentTypeID = PType.paymentTypeID
GROUP BY lfp.licenceID, PType.PaymentTypeDesc) Payment
ON P.licenceID = Payment.licenceID
从您的'UNION'语句中删除'ALL'。 –
@Ken谢谢你的时间。我已添加到我的帖子,仍然有一个问题,我会帮忙。正如注册用户指出的那样,并不像删除所有的那样简单。 – Mat41
然后您需要提供更多信息(如某些示例数据和您希望从该数据获得的输出)。没有它,我们只能猜测问题可能是什么,而这不是StackOverflow的工作原理。 –