T-SQL,列表

时间:2013-10-15 06:21:38

标签: sql sql-server list tsql

我正在使用T-SQL和Microsoft SQL Server。 我有不同的表格,我希望得到一个特定的结果,如示例

我有3个“食谱”表,其中包含不同的成分:

|Recipe X|       |Recipe Z|       |Recipe V|
__________       __________       __________
A                A                B
B                D                E
C                F                C

我还有一个表周:

Mon||Tue||Wed||Thu||Fri||Sat||Sun
---------------------------------
X  | Z |  X  | V  | Z  | V  | V

对于一周中的每一天都有食谱。 我想找哪一天有食谱和位置(例如星期一的位置是1,星期二是2 ......)

所以它看起来像

食谱X:(1,3)

食谱Z:(2,5)

食谱五:(4,6,7)

我没有在T-SQL中找到列表的方法 如果还有其他办法可以做到这一点吗?

由于

2 个答案:

答案 0 :(得分:1)

是。将周表标准化为日,配方和位置字段。

Mon X 1
Tue Z 2

那么这是一个简单的查询

select position
from table
where recipe = 'z'

如果你想要的话,你可以从日期名称计算位置,反之亦然。

答案 1 :(得分:1)

您正在使用的表格结构使查询有点复杂,您应该真的查看@ podiluska建议规范化表格。

也就是说,使用基本上“在运行时进行规范化”的cte (or Common Table Expression)以及获得结果的常规查询是可行的;

WITH cte AS (
  SELECT '1' day, Mon Recipe FROM Week UNION ALL
  SELECT '2' day, Tue Recipe FROM Week UNION ALL
  SELECT '3' day, Wed Recipe FROM Week UNION ALL
  SELECT '4' day, Thu Recipe FROM Week UNION ALL
  SELECT '5' day, Fri Recipe FROM Week UNION ALL
  SELECT '6' day, Sat Recipe FROM Week UNION ALL
  SELECT '7' day, Sun Recipe FROM Week
)
SELECT DISTINCT 'Recipe_' + Recipe AS Recipe,
   Days=STUFF((SELECT ','+day FROM cte WHERE Recipe=A.Recipe FOR XML PATH('')), 
                                                                  1 , 1 , '' )
FROM 
   cte A

An SQLfiddle to test with