像从结果表中读取的statment进行比较

时间:2016-08-11 12:27:42

标签: sql sql-server

在我的数据库中有文章。下面的示例或文章,如您所见,总是有一篇主文章(末尾为.1)可能包含下一个组合(。+ 1)

1st article:
-------------------------------------------------------
12.3356.1 <- main artikel (1)
12.3356.2 <- sub artikel (2)
12.3356.3 <- sub artikel (3)

2nd article:
-------------------------------------------------------
4.641.1   <- main artikel (1)

3rd article:
-------------------------------------------------------
664.6241.1   <- main artikel (1)
664.6241.2   <- sub artikel (2)
664.6241.3   <- sub artikel (3)
664.6241.4   <- sub artikel (4)

4th article:
-------------------------------------------------------
7.31.1   <- main artikel (1)
7.31.2   <- sub artikel (2)

现在我的程序中有一些特定的文章。让我们说:

12.3356.3
7.31.2 

现在我要做的就是把它们和所有其余部分关联在同一个数字中,所以在这种情况下结果如下:

12.3356.1
12.3356.2
12.3356.3

7.31.1
7.31.2

所以我到目前为止所做的是:

;WITH cutted_nummers (cut_num) as (select REVERSE(SUBSTRING(REVERSE(Nummer),CHARINDEX('.',REVERSE(Nummer)),len(Nummer))) from T_Artikel),
dist_nums (dist_num) as (select distinct(cut_num) from cutted_nummers),
final (nums) as (select dist_num from dist_nums) select * from final

所以通过这个查询我得到那些文章,然后我从这两篇文章中删除了最后的.digit,所以我进入了决赛桌:

12.3356.  (without 3 at the end)
7.31.     (without 2 at the end)

现在有了这个结果,我必须查看我的artikel表并获得所有数字,从这两个中的一个开始,这是我不知道该怎么做的事情。我想我需要一些声明,但是如何对这个结果说LIKE,所以这应该是这样的:

select * from artikeltable that nummerfield is like '12.3356.%' or '7.31.%'

所以必须根据来自“最终”的两篇文章构建(在这种情况下)表

编辑需要:

;WITH cutted_nummers (cut_num) as (select REVERSE(SUBSTRING(REVERSE(Nummer),CHARINDEX('.',REVERSE(Nummer)),len(Nummer))) from T_Artikel),
dist_nums (dist_num) as (select distinct(cut_num) from cutted_nummers),
final (nums) as (select dist_num from dist_nums)
SELECT Nummer FROM T_Artikel
WHERE
    SUBSTRING(Nummer , 0, LEN(Nummer ) -  CHARINDEX(REVERSE(Nummer ), '.', 0)) IN 
    (
        SELECT nums FROM final
    )

2 个答案:

答案 0 :(得分:0)

这样做你想要的吗?

select *
from artikeltable 
where nummerfield like '12.3356.%' or nummerfield like '7.31.%';

答案 1 :(得分:0)

您需要动态查询。

DECLARE @Tmp NVARCHAR(MAX) = ''
SELECT @Tmp = COALESCE(@Tmp, '') +  ' nummerfield LIKE ''' + ColumnName + '%'' OR' FROM final 

DECLARE @Query NVARCHAR(MAX)  = 'select * from artikeltable  WHERE ' + LEFT(@Tmp, LEN(@Tmp) - 3)
--SELECT @Query
EXEC sp_executesql @Query

顺便说一下,你也可以找到这种方式。

DECLARE @val NVARCHAR(100) = '12.3356.2'
SELECT SUBSTRING(@val, 0, LEN(@val) + 2 -  CHARINDEX('.', REVERSE(@val))) -- 12.3356.

更新

试试这个

SELECT * FROM artikeltable
WHERE
    SUBSTRING(nummerfield , 0, LEN(nummerfield ) + 2 -  CHARINDEX('.', REVERSE(@val))) IN 
    (
        SELECT * FROM final
    )