我想使用同一查询,该查询几乎永远不会通过多个表返回任何结果。表格名称与年份相同,只是增加了年份。所以我的查询看起来像这样:
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查询。最佳做法是什么,如何只执行一次就可以对所有表使用此查询?
谢谢!
答案 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子查询的结果写到新表中,并且从现在开始使用它。