如何在表之间没有公共字段的两个表中获取结果表?

时间:2012-08-17 05:08:03

标签: sql-server

我有两张桌子,如下所示。

First Table

enter image description here

考虑表之间没有这种关系。

所以我需要我的结果表应该如下所示。

enter image description here

我怎么能实现这个目标?

4 个答案:

答案 0 :(得分:2)

您的DebitNoteTable中的“AcctRef”是"repeating column"

这是一个巨大的,巨大的,禁忌的:)

你的借记表应该是这样的:

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


SQL Fiddle Demo

答案 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