【问题标题】:Completing my recursive SQL operation, is cte a good choice for me?完成我的递归 SQL 操作,cte 对我来说是一个不错的选择吗?
【发布时间】:2015-04-23 14:42:18
【问题描述】:

我有以下数据:

TestData
Code | RowNum |
123  | 1      |
456  | 2      |
789  | 3      |

我想要完成的是循环遍历这些数据,检查一个单独的表以查看是否有任何记录是LIKE 这些代码。这是我尝试过的,但最后我返回了0 记录。我相信我可以使用 cte 来完成此任务,但我在理解递归 cte 的基本概念时遇到了一些麻烦。我在这里走错方向了吗?下面是我的查询,它返回 0 记录。

DECLARE @myCounter int = 0;
WHILE (@myCounter < @ROWCOUNT)
BEGIN
    DECLARE @Code nvarchar(8) = (SELECT [Code]
                                 FROM [MyTable]
                                 WHERE [RowNum] = @myCounter);
    SELECT *
    FROM [RefTable]
    WHERE [Code] LIKE '%' + @Code + '%';
END

【问题讨论】:

    标签: sql tsql recursion while-loop common-table-expression


    【解决方案1】:

    看起来这应该通过使用LEFT JOIN 的单个查询来完成:

    SELECT m.RowNum, m.Code, COUNT(*) AS c
    FROM MyTable m
    LEFT JOIN RefTable r ON ( r.Code LIKE '%' + m.Code + '%' )
    GROUP BY m.RowNum, m.Code
    ORDER BY m.RowNum
    

    使用JOIN 而不是LEFT JOIN 来忽略没有条目的行而不是显示0

    【讨论】:

      【解决方案2】:

      不确定它是否有很大帮助,但如果您尝试将代码与另一个表匹配,您始终可以使用 LIKE 条件进行连接,并可能避免递归搜索。

      SELECT * FROM T1
      RIGHT JOIN T2
      ON T1.CODE LIKE '%' + T2.CODE + '%'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-19
        • 2017-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多