2

首先,对不起,因为我不知道如何命名我的问题。

我的情况是,我有 1 个具有这种格式的查找表:

+----+-----------+------------+
| ID | Fruit     |  Color     |
+----+-----------+------------+
|  1 | Banana    | Yellow     |
|  2 | Apple     | Red        |
|  3 | Blueberry | NotYetBlue |
+----+-----------+------------+

我的主表是这样的:

+-------+------------------------+------------+
| MixID |        Contains        | MixedColor |
+-------+------------------------+------------+
|     1 | Banana                 |            |
|     2 | Apple:Blueberry        |            |
|     3 | Banana:Apple:Blueberry |            |
+-------+------------------------+------------+

我想查找第一个表并填写 MixedColor 列,如下所示:

+-------+------------------------+-----------------------+
| MixID |        Contains        |      MixedColor       |
+-------+------------------------+-----------------------+
|     1 | Banana                 | Yellow                |
|     2 | Apple:Blueberry        | Red:NotYetBlue        |
|     3 | Banana:Apple:Blueberry | Yellow:Red:NotYetBlue |
+-------+------------------------+-----------------------+

任何帮助将不胜感激。

谢谢

4

2 回答 2

3

正如“Charles Bretana”所建议的那样,最好将您的架构修改为以下内容:

+--------+-------+----------+
| RowID  | MixID |  FruitID |
+--------+-------+----------+
|    0   |     1 |     1    | 
|    1   |     2 |     2    | 
|    2   |     2 |     3    | 
|    3   |     3 |     1    | 
|    4   |     3 |     2    | 
|    5   |     3 |     3    | 
|--------+-------+----------+

现在使用一个简单的方法inenr join,您可以选择正确的颜色并匹配水果。

如果您无法实现该构造,则可以使用此处提到的递归查询:将逗号分隔的字符串转换为单独的行。操纵您的数据使其看起来像这样。

这是一个 SQL 小提琴:http ://sqlfiddle.com/#!3/8d68f/12

表数据:

create table Mixses(MixID int, ContainsData varchar(max))
insert Mixses select 1,  '10:11:12'
insert Mixses select 2,  '10:11'
insert Mixses select 3,  '10'
insert Mixses select 4,  '11:12'

create table Fruits(FruitID int, Name varchar(200), Color varchar(200))
insert Fruits select 10,  'Bannana'    , 'Yellow'
insert Fruits select 11,  'Apple'      , 'Red'
insert Fruits select 12,  'BlueBerry'  , 'Blue'
insert Fruits select 13,  'Pineapple'  , 'Brown'

询问:

;with tmp(MixID, DataItem, Data)  as 
(
  select 
        MixID, 
        LEFT(ContainsData, CHARINDEX(':',ContainsData+':')-1),
        STUFF(ContainsData, 1, CHARINDEX(':',ContainsData+':'), '')
  from Mixses

  union all

  select MixID, 
        LEFT(Data, CHARINDEX(':',Data+':')-1),
        STUFF(Data, 1, CHARINDEX(':',Data+':'), '')
  from tmp
  where Data > ''
)

select t.MixID, t.DataItem, f.Color
from         tmp t
inner join   Fruits f on f.FruitID=t.DataItem
order by MixID
于 2013-07-11T02:40:08.257 回答
3

我同意理想情况下应该更改您的表结构。但是,你可以得到你想要的:

SELECT   MIXID, [CONTAINS],
STUFF((
          SELECT ':' + Color
          FROM Table1 a
          WHERE ':'+b.[Contains]+':' LIKE '%:'+a.Fruit+':%'
                FOR XML PATH('')
            ), 1, 1, '') AS Color
FROM Table2 b
GROUP BY MIXID, [CONTAINS]

演示:SQL 小提琴

于 2013-07-11T03:15:11.293 回答