我有两张桌子,如下所示。
考虑表之间没有这种关系。
所以我需要我的结果表应该如下所示。
我怎么能实现这个目标?
答案 0 :(得分:2)
这是一个巨大的,巨大的,禁忌的:)
你的借记表应该是这样的:
Debit No AcctRef
-------- -------
DN1 CMP1
DN1 CMP3
DN1 CMP6
...
然后你可以做一个简单的“加入”;)
这是对标准化的一个很好的概述。我绝对鼓励你重新审视你的架构,如果可能的话:
如果不能,那么我猜“Plan B”会编写一个程序:
读取所有价格并将其存储在表格中
读取所有借记的所有AcctRef
将每个AcctRef解析为个人应计
打印每笔应计的价格和每笔借记
这实际上意味着读取整个数据库中的所有数据,然后手动重新组织它。如果您打算这样做,为什么还要首先考虑数据库呢?
PS: 不幸的是,您为表使用了位图。文本会更好;)
答案 1 :(得分:1)
试试这个:
由于表未规范化,您必须执行以下步骤。在列中保留逗号分隔值是个坏主意。对于桌子上的任何类型的操作,你必须拆分..
第1步:您必须创建以下函数来拆分accRef列
create FUNCTION [dbo].[SDF_SplitString]
(
@sString varchar(2048),
@cDelimiter char(1)
)
RETURNS @tParts TABLE ( part varchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
@iPos int
if substring( @sString, 1, 1 ) = @cDelimiter
begin
set @iStart = 2
insert into @tParts
values( null )
end
else
set @iStart = 1
while 1=1
begin
set @iPos = charindex( @cDelimiter, @sString, @iStart )
if @iPos = 0
set @iPos = len( @sString )+1
if @iPos - @iStart > 0
insert into @tParts
values ( substring( @sString, @iStart, @iPos-@iStart ))
else
insert into @tParts
values( null )
set @iStart = @iPos+1
if @iStart > len( @sString )
break
end
RETURN
END
第2步:
使用此查询获取结果
with cte as(
select * from DebitNote cross apply dbo.SDF_SplitString(AccRef,','))
select part,price,[Debit No]=STUFF((SELECT ', ' + DebitNo
FROM cte b
WHERE b.part = a.part
FOR XML PATH('')), 1, 2, '')
FROM cte a join AccrualNote
on part=AccrualNo
GROUP BY part,price
答案 2 :(得分:0)
我想它应该是这样的:
SELECT a.Accrual_No, a.Price, d.Debit_no FROM AccrualNote AS a, DebitNote as d
WHERE a.Accrual_No IN d.AccRef
接下来,您需要为使用此查询获得的记录创建一个循环(只需使用phpMyAdmin进行尝试
(确保paulsm4绝对正确,但也许你无法改变表结构)
答案 3 :(得分:0)
CREATE FUNCTION [dbo].[F_Get_DebitNo] ( @AccrualNo VARCHAR(20) )
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @DebitNo VARCHAR(100)
SET @DebitNo = ''
SELECT @DebitNo = @DebitNo + ',' + DebitNo
FROM DebitNote
WHERE CHARINDEX(@AccrualNo, AccRef) > 0
SELECT @DebitNo = RIGHT(@DebitNo, LEN(@DebitNo) - 1)
RETURN @DebitNo
END
sql运行良好,我已经测试过,你只需要创建一个Scalar-values函数,如下所示。
SELECT AccrualNo ,
Price ,
dbo.F_Get_DebitNo(AccrualNo) FROM AccrualNote