如何查找子查询字符串包含主查询字符串的行?

时间:2020-08-19 22:27:33

标签: sql-server string csv sql-server-2008 subquery

例如,这是2个表,每个表1行:

餐桌人物

id   age
0    30 
1    41
2    15

餐桌人物

ids    group
0,2    a
1      b

如何使此查询有效?

SELECT id, age FROM Person WHERE ID like (select ids FROM People WHERE ids = '0,2')

这应该列出第一个表的ID 0和2行,即“ 0,2”中包含的任何ID。

id   age
0    30 
2    15

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:2)

您应该首先努力修复数据模型。您不应该在字符串列中存储多个数值。

如果某人可能属于一个组,则只需在person表中添加一列即可代表相关组的id

  • 表组:
id   name
1    a
2    b
  • 餐桌人物:
id   age   group_id
1    30    1
2    41    1
3    15    2

如果某人可能属于may组,则应该有一个单独的表,其中每个(id, grp)元组都存储在单独的行中。

  • 表组:
id   name
1    a
2    b
  • 餐桌人物:
id   age
1    30 
2    41
3    15
  • 表person_groups:
id_person    id_group
1            1
2            1
3            1
3            2

通过这两种设置,编写查询以检索给定组的成员或将表联接在一起很容易。


就您当前的设计而言:我认为您正在寻找跨表的联接条件。一种选择是:

SELECT pn.id, pn.age 
FROM Person pn 
INNER JOIN People pe ON ',' + pe.ids + ',' LIKE '%,' + pn.id + ',%'
WHERE pe.group = 'a'

或使用exists条件:

SELECT pn.* 
FROM Person pn 
WHERE EXISTS (
    SELECT 1
    FROM People pe 
    WHERE
        ',' + pe.ids + ',' LIKE '%,' + pn.id + ',%'
        AND pe.group = 'a'
)