所以我有一个SQL查询问题,我正在努力解决这个问题:
它目前带回6710445行,但我需要根据特定的字符串字段应用更多条件。
SELECT
Table1.ExampleColumn1 -- (ID)
,Table1.ExampleColumn2
,Table2.ExampleColumn3
,Table2.ExampleColumn4
,Table3.ExampleColumn5
,Table3.ExampleColumn6
,Table1.StringField
FROM [Example Database].[dbo].[Table1] AS Table1
INNER JOIN [Example Database].[dbo].[Table2] AS Table2
ON Example = Example
INNER JOIN [Example Database].[dbo].[Table3] AS Table3
ON Example = Example
WHERE Month BETWEEN 201304 AND 201603
AND (Age < 19)
以上'Table1.StringField'
在每行中都显示以下类型代码:"||J183,Y752,J374,Y752."
我还有一个参考表(称之为'Ref1'),其中514个这些代码单独显示,表中没有任何其他字段。
所以我需要能够做的是从上面的查询中查找行,其中“Ref1”中的任何值都显示在“Table1.StringField”各行中的任何位置,如果不包含该行中的那一行结果集。
我试图删除逗号和'||'的'StringField'列但它没有像我希望的那样好用,最终带回了超过30M的行。
关于如何做到这一点的任何想法?优选所以它是有效的,并不会让用户等待10分钟只是查询它?
答案 0 :(得分:0)
也许这会让你走到一半......我也同意Sean Lange关于不开始存储分隔数据的评论,但我认为OP已经知道这一点。您也可以转动/取消转换此数据以实现此目的。这可能是你做某事的最蛮力的方式。
--DROP TABLE #Table
--DROP TABLE #Ref
CREATE TABLE #Table (Col VARCHAR(MAX))
CREATE TABLE #Ref (Code VARCHAR(10))
INSERT INTO #Table (Col) VALUES ('A123,B234,C345'),('A123'),('C345')
INSERT INTO #Ref (Code) VALUES ('A123'),('B234')
SELECT * FROM #Table
SELECT * FROM #Ref
SELECT DISTINCT t.Col
FROM #Table t
CROSS APPLY (
SELECT CASE WHEN CHARINDEX(r.Code, t.Col) > 0 THEN 1 ELSE 0 END AS [ItsHere] FROM #Ref r) oa
WHERE oa.ItsHere = 1
答案 1 :(得分:0)
您需要做的是将查询加入Ref1
上的Table1.StringField = Ref1.Ref_1_value
表格,然后排除不匹配任何Table1
的{{1}}行。像这样:
Ref_1_value