Sql 如何在与另一列中的多行相关的一列中连接CSV上的表?

Sql 如何在与另一列中的多行相关的一列中连接CSV上的表?,sql,csv,join,Sql,Csv,Join,我试图找出如何将数据结构如下所示的两个表连接在一起 因此,基本上我需要查看表A中的产品级别,如果它是(x),那么只包括表A中所有产品标识符都存在于表B的类型(x)ID中的记录 因此,查看下面的“数据”,我只希望返回表a的第1行和第3行,因为所有3个标识符都存在于表B的正确类型(x)ID列中 我希望这是有意义的,因为我对如何实现这一点有点迷茫 另外,仅供参考,我仅限于相当基本的SQL,没有存储过程或函数 表 ------------------------------------- ID | Pr

我试图找出如何将数据结构如下所示的两个表连接在一起

因此,基本上我需要查看表A中的产品级别,如果它是(x),那么只包括表A中所有产品标识符都存在于表B的类型(x)ID中的记录

因此,查看下面的“数据”,我只希望返回表a的第1行和第3行,因为所有3个标识符都存在于表B的正确类型(x)ID列中

我希望这是有意义的,因为我对如何实现这一点有点迷茫

另外,仅供参考,我仅限于相当基本的SQL,没有存储过程或函数

-------------------------------------
ID | ProductIdentifier | ProductLevel
-------------------------------------
1  | 123, 234, 345     | 1
2  | 321, 432, 543     | 2
3  | 345, 544, 346     | 3
表B

-------------------------------------
ID | Type1ID | Type2ID | Type3ID
-------------------------------------
1  | 123     | 321     | 345   
2  | 234     | 432     | 544  
3  | 345     | 233     | 346  
差不多

Select * from TableA
inner join TableB on
'%,' + Type1ID + ',%' like ',' + ProductIdentifier + ',' AND
'%,' + Type2ID + ',%' like ',' + ProductIdentifier + ',' AND
'%,' + Type3ID + ',%' like ',' + ProductIdentifier + ',' 

谁知道呢,也许会有用。不过也不太好。

理想情况下,您应该找到一种重新构造数据的方法(或者至少有一个单独的表,将数据聚合成易于查询的形式)

但是,下面的查询应该可以完成这项工作。。虽然这将是相当低效的!!我假设ProductIdentifier的数据类型是一个VARCHAR并且不能更改,因此我在查询中使用了replace和trim来整理它

规范化数据是进行此操作的方法。。。但如果你真的必须这样做,请尝试以下方法:

SELECT TableA.* FROM TableA 
    LEFT OUTER JOIN TableB as B1 on FIND_IN_SET(B1.Type1ID, trim(replace(ProductIdentifier,' ', ''))) > 0 
        and TableA.ProductLevel = 1
    LEFT OUTER JOIN TableB as B2 on FIND_IN_SET(B2.Type2ID, trim(replace(ProductIdentifier,' ', ''))) > 0 
        and TableA.ProductLevel = 2
    LEFT OUTER JOIN TableB as B3 on FIND_IN_SET(B3.Type3ID, trim(replace(ProductIdentifier,' ', ''))) > 0 
        and TableA.ProductLevel = 3
GROUP BY TableA.ID 
HAVING 
    COUNT(DISTINCT B1.Type1ID) = 1+CHAR_LENGTH(ProductIdentifier)-CHAR_LENGTH(replace(ProductIdentifier,',', '')) /* Number of rows is equal to the number of items in ProductIdentifier (calculated using length of string minus length of string with commas removed) */
    OR COUNT(DISTINCT B2.Type2ID) = 1+CHAR_LENGTH(ProductIdentifier)-CHAR_LENGTH(replace(ProductIdentifier,',', ''))
    OR COUNT(DISTINCT B3.Type3ID) = 1+CHAR_LENGTH(ProductIdentifier)-CHAR_LENGTH(replace(ProductIdentifier,',', ''));

修复您的数据结构,以便有一个连接表。不要以字符串形式存储ID列表。不要将整数存储为字符串。对于设计用于链接两个表的列,一定要使用外键引用。有没有可能重新构造表B?您可以将其更改为有3个列(ID、type、relatedID),并且在表B中每个产品有3行。这样,如果您添加更多类型,那么表结构就不必更改。对不起,我还应该说我一直使用此结构。。。相信我,我问的第一件事是我能改变数据结构吗。