【发布时间】:2015-12-04 05:42:42
【问题描述】:
我有两张桌子。 led 和 Tbl_LoanMst
CREATE TABLE [dbo].[led](
[GLCode] [varchar](10) NOT NULL,
[AccountID] [varchar](15) NULL,
[Dr_Cr] [char](1) NOT NULL,
[amount] [money] NULL,
[LoanRefNo] [varchar](20) NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[Tbl_LoanMst](
[SrNo] [int] IDENTITY(1,1) NOT NULL,
[Acctno] [varchar](15) NULL,
[LoanTranchNo] [varchar](20) NULL,
[DisbursalDate] [varchar](8) NULL,
[LoanStartDate] [varchar](8) NULL,
[Tenure] [money] NULL,
[LoanExpiryDate] [varchar](8) NULL,
[InterestRate] [money] NULL,
[PenalInterestRate] [money] NULL,
[IntrFrequency] [char](11) NULL,
[LoanAmount] [money] NULL,
[ApplicableDP] [money] NULL,
[ProcessingFees] [money] NULL,
[OtherCharges] [money] NULL,
[Paymode] [varchar](6) NULL,
[Chq_BankTxnNo] [varchar](15) NULL,
[CompanyBankID] [varchar](20) NULL,
[CompanyBankAcctno] [varchar](20) NULL,
[Cl_BankID] [varchar](10) NULL,
[Cl_BankAcctno] [varchar](20) NULL,
[LedgerRefNo] [varchar](20) NULL,
[Status] [char](1) NULL,
[uMkrid] [varchar](11) NULL,
[uMkrdt] [datetime] NULL,
[aMkrid] [varchar](11) NULL,
[aMkrdt] [datetime] NULL,
[BF_Generated] [varchar](5) NULL,
[bankaccttype] [varchar](20) NULL,
[LoanType] [varchar](20) NULL
) ON [PRIMARY]
这是我的工作查询。
declare @LasAcctNo varchar(20) = 'las00004'
select distinct LoanTranchNo, convert(varchar,convert(datetime,LoanStartDate),103) LoanStartDate,
(select CONVERT(numeric(18,2),ROUND( sum(amount),2)) from led where GLCode = 'LASPAC' and LoanRefNo = LoanTranchNo and Dr_Cr='D' ) as LoanAmount,
(select CONVERT(numeric(18,2),ROUND( sum(amount),2)) from led where GLCode = 'LASPAC' and LoanRefNo = LoanTranchNo and Dr_Cr='C' ) PrincipalPaid
, (select CONVERT(numeric(18,2),ROUND( sum(amount),2)) from led where GLCode = 'LASPAC' and LoanRefNo = LoanTranchNo) 'OsLoanAmount',
InterestRate,
(select CONVERT(numeric(18,2),ROUND( sum( case when Dr_Cr='C' then amount *-1 else amount end ),2)) from led where GLCode = 'INTRAC' and LoanRefNo = LoanTranchNo) InterestAccruedDue,
(select CONVERT(numeric(18,2),ROUND( sum(case when Dr_Cr='C' then amount *-1 else amount end ),2)) from led where GLCode = 'PNLINT' and LoanRefNo = LoanTranchNo) PenalDue ,0 as 'TotalOutstanding',
(select CONVERT(numeric(18,2),ROUND( sum(case when Dr_Cr='C' then amount *-1 else amount end ),2)) from led where GLCode = 'INTRND' and LoanRefNo = LoanTranchNo) InterestAccruedbutnotdue,
(select CONVERT(numeric(18,2),ROUND( sum(case when Dr_Cr='C' then amount *-1 else amount end ),2)) from led where GLCode = 'TDSACC' and LoanRefNo = LoanTranchNo)as TDS,
(select CONVERT(numeric(18,2),ROUND( sum(case when Dr_Cr='C' then amount *-1 else amount end ),2)) from led where GLCode = 'CLNCTRLAC' and AccountID = Acctno)as ControlAcct,
convert(varchar,convert(datetime,LoanExpiryDate),103) LoanEndDate,IntrFrequency,isnull(LoanType,'SECURED') as LoanType
from tbl_loanmst
left join led on LoanTranchNo= LoanRefNo and AcctNo = AccountID
where AcctNo= @LasAcctNo and status='A'
是否可以使用联接重写此查询?如果是怎么办?
为了让您尽可能方便,我在以下链接中包含了插入语句: http://en.textsave.org/mwOb
【问题讨论】:
-
嗨。您已经在使用联接。您能否告诉我们您正在尝试解决什么问题,或者是总体风格改进,还是...?
-
@wwkudu 我只是想通过这样做来学习。我想知道如果我能够将这个
select column1, (select ......) as column2 from table...重写为select column1, table.column2 from table join table2是否会带来任何性能改进,即使没有性能改进我仍然想学习一种新风格。 -
酷。进行连接的两种方式是
select columns from t1, t2 where t1.foreign_key=t2.primary_key和select columns from t1 left join t2 on t1.foreign_key=t2.primary_key。在大多数数据库中,它们的性能相当。当然,它们不必只是外键和主键。您已经在使用后者。如果我想得直,前者只是一个内部连接。后者有更多的选择,一个解释哪个的图表,是here。 -
您可以嵌套 CASE 以消除子查询。
-
@SubqueryCrunch 怎么样?
标签: sql sql-server sql-server-2008 tsql join