1

一連の有効な値を表す1つのフィールドでテーブルを結合する方法はありますか?たとえば、一方のテーブルには「51234」の数値または文字列があり、もう一方のテーブルには「46610..46680 | 48670 | 50000..54280|48240」のようなものがあります。これらを直接結合する方法がない場合、そのシリーズを、テーブル変数などの各数値を含む行に変換する方法はありますか?

そのシリーズ列は、部門にマップされている総勘定元帳アカウントのDynamics Nav5.0SP1から生成されています。私はそのシステムの経験がほとんどなく、私たちが持っていることの多くは、サードパーティが行うように契約されたカスタマイズでした。そのため、標準である場合とそうでない場合があります...データベースに直接アクセスすることさえできません。そのためにも、しかし私が知る限り、そのシリーズはvarchar(100)として格納されています。

私はたくさん検索しましたが、私がしなければならないことのようなものを見たことがありません。うまくいけば、ここの誰かがいくつかのアイデアを持っています。

4

2 に答える 2

1

まず、これはデータベースの設計が貧弱なので、DynamicsNavやサードパーティの請負業者がよく知っているはずです。そのように格納されている列のテーブルを結合できます。

あなたのために働くLIKE句を構築することが可能かもしれません t1 JOIN t2 ON t1.id LIKE ('%' + t2.id + '%')

したがって、t1が '46610 | 46680 |50000|'の場合 そしてt2が46680だったら、これは一致するでしょう。ただし、これはすぐに手に負えなくなり、あなたがやろうとしていることを正確に達成するのは難しいかもしれません。

最善の策は、データを正規化することです。これは、あなたが提案したことを正確に実行し、各値を独自の行に分割しています。これを実現する内部の「分割」関数はありませんが。これがSQLサーバーの分割に関するSOの投稿です:link

正直なところ、これは処理できない問題のように聞こえますが(DBに直接アクセスできない)。そもそも正規化されたデータを作成するためにこれを書き直すために誰かを雇うか、このプロセスを修正するためのアクセス権を持っている人を要求することをお勧めします。

于 2012-03-28T16:23:40.200 に答える
1

私はこれで必要なことをするようになりました:

create PROCEDURE [dbo].[spv_parseGLAccounts] (
    @AllowableAccountFilter AS varchar(250),
    @DeptID AS varchar(6),
    @CompCode AS varchar(6)) AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @FirstOrLocation int, @FirstRangeLocation int;
    DECLARE @LeftPart varchar(250), @RightPart varchar(250)
    SET @AllowableAccountFilter = LTRIM(RTRIM(@AllowableAccountFilter))
    SET @FirstOrLocation = CHARINDEX('|',@AllowableAccountFilter)
    SET @FirstRangeLocation = CHARINDEX('.',@AllowableAccountFilter)

    IF @FirstOrLocation <> 0    -- Split on |
        BEGIN
            SET @LeftPart = SUBSTRING(@AllowableAccountFilter, 1, @FirstOrLocation - 1)
            SET @RightPart = SUBSTRING(@AllowableAccountFilter, @FirstOrLocation + 1, LEN(@AllowableAccountFilter) - @FirstOrLocation)
            EXEC spv_parseGLAccounts @LeftPart, @DeptID, @CompCode
            EXEC spv_parseGLAccounts @RightPart, @DeptID, @CompCode
        END
    ELSE IF @FirstRangeLocation <> 0 -- Split on ..
        BEGIN
            INSERT INTO ValidAccountMapping (DeptID, CompCode, BeginAccount, EndAccount)
                VALUES (@DeptID, @CompCode, SUBSTRING(@AllowableAccountFilter, 1, @FirstRangeLocation - 1), 
                    SUBSTRING(@AllowableAccountFIlter, @FirstRangeLocation + 2, LEN(@AllowableAccountFilter) - @FirstRangeLocation - 1))
        END
    ELSE
        BEGIN
            INSERT INTO ValidAccountMapping (DeptID, CompCode, BeginAccount, EndAccount)
                VALUES (@DeptID, @CompCode, @AllowableAccountFilter, @AllowableAccountFilter)
        END 
END
于 2012-03-29T16:05:29.640 に答える