-1

我有两张桌子tbl_Categorytbl_Course.

tbl_Category我有这样的行:

 CatID CatName CatDesc
  1     Cat1   catDesc1
  2     Cat2   catDesc2
  3     Cat3   catDesc3
  4     Cat4   catDesc4
  5     Cat5   catDesc5

tbl_course价值观就像

CoursID Name AssignCategory AdditionalCat
 1       cou1   1             2,3
 2       cou2   2               3
 3       cou3   1             3,4 

我需要如下结果

包含 AsignCategory 和 additionalcat 的类别

 CatID CatName CatDesc
  1     Cat1   catDesc1
  2     Cat2   catDesc2
  3     Cat3   catDesc3
  4     Cat4   catDesc4

不包含 AsignCategory 和 additionalcat 的类别

 CatID CatName CatDesc
  5     Cat5   catDesc5

我正在使用这个拆分功能

CREATE FUNCTION dbo.StrSplit (@sep char(1), @s varchar(512))  
RETURNS table  
AS  
RETURN (  
    WITH Pieces(pn, start, stop) AS (  
      SELECT 1, 1, CHARINDEX(@sep, @s)  
      UNION ALL  
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)  
      FROM Pieces  
      WHERE stop > 0  
    )  
    SELECT pn,  
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s  
    FROM Pieces  
  )  

我正在使用以下查询形式分配类别结果:

 select * from dbo.Tbl_Category
 where catid in(select assigncategory from Tbl_Course ) 

 )

 select * from dbo.Tbl_Category
 where catid not in(select assigncategory from Tbl_Course          
 )

请帮我完成上述查询的其他类别结果。

4

1 回答 1

3

您应该使用 CROSS APPLY 来使用您的StrSplitudf:

SELECT * FROM dbo.tbl_Category
WHERE CatID IN(
    SELECT AssignCategory 
    FROM tbl_Course
    UNION
    SELECT CAST(split.S as int) 
    FROM tbl_Course
    CROSS APPLY dbo.StrSplit(',', AdditionalCat) as split )

SELECT * FROM dbo.tbl_Category
WHERE CatID NOT IN(
    SELECT AssignCategory 
    FROM tbl_Course
    UNION
    SELECT CAST(split.S as int) 
    FROM tbl_Course
    CROSS APPLY dbo.StrSplit(',', AdditionalCat) as split )

SQLFiddle在这里

您还可以使用 UNPIVOT 来避免使用 UNION。但由于只有 2 列需要合并,因此 UNION 对于此目的可能“足够好”。

于 2013-04-23T17:01:17.443 回答