通过多个表循环查询

时间:2020-02-19 16:56:01

标签: sql sql-server loops dynamic-sql

我想使用同一查询,该查询几乎永远不会通过多个表返回任何结果。表格名称与年份相同,只是增加了年份。所以我的查询看起来像这样:

UIViewController* myFirstVC = [[UIViewController alloc] init];
UIViewController* mySecondVC = [[UIViewController alloc] init];

// "self" is your ApolloTabBarController.
[self setViewControllers:@[myFirstVC, mySecondVC]];

myFirstVC.tabBarItem = 
    [[UITabBarItem alloc] initWithTitle:@"First" image:nil tag:0];

mySecondVC.tabBarItem = 
    [[UITabBarItem alloc] initWithTitle:@"Second" image:nil tag:1];

我想遍历从2001年到2020年的所有年份。因此它应该像这样:

// In your example, your ApolloTabBarController acts as its own delegate.
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
    UIViewController* activeVC = 
        [[self viewControllers] objectAtIndex:[item tag]];
}

如果有结果,可以将它们存储在临时表中。我想到用表名创建循环或创建动态sql查询。最佳做法是什么,如何只执行一次就可以对所有表使用此查询?

谢谢!

2 个答案:

答案 0 :(得分:2)

要重申我的评论:

这听起来像是非规范化问题,实际上您应该有1个表,其中有一个年份列。

真的,您应该修复设计。

无论如何,要解决这个问题:是的,您可以使用动态SQL来做到这一点,但是最好修复设计。但是,这将动态创建并执行该语句。由于缺少版本标签,我使用了FOR XML PATH

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);


SET @SQL = STUFF((SELECT @CRLF + N'UNION ALL' + @CRLF +
                         N'SELECT p.productID, po.name, p.price' + @CRLF +
                         N'FROM ' + QUOTENAME(t.[name]) + N'p' + @CRLF +
                         N'     JOIN product po ON p.productID = po.id' + @CRLF +
                         N'WHERE p.price < 0'
                  FROM sys.tables t
                  WHERE t.[name] LIKE N'prices[_]20[0-9][0-9]'
                  ORDER BY t.[name]
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,13,N'') + N';';

--PRINT @SQL; --Your debugging friend

EXEC sys.sp_executesql @SQL;

答案 1 :(得分:1)

这是困难且昂贵的(循环SQL语句!),因为您的架构很糟糕。相反,您应该有一个与现有表相同的表prices,但有一个称为year的额外列。这样,联接就变得很简单,您不必仅因为日期更改而创建新表。

尽管您可以将表统一在一起并获得相同的结果。像这样:

SELECT p.productID, po.name, p.price, po.year
FROM products p
     INNER JOIN 
         (
              SELECT id, name, 2001 as year FROM prices_2001
              UNION ALL SELECT id, name, 2002 FROM prices_2002
              UNION ALL SELECT id, name, 2003 FROM prices_2003
              UNION ALL ... <continue until you have all year tables accounted for>
         ) po
         ON p.productID = po.id
WHERE po.price < 0;

考虑将UNION子查询的结果写到新表中,并且从现在开始使用它。

相关问题