SELECT
(
SELECT SUM(ISNULL(Volume,0))
FROM Order_【a1.Login】
WHERE Login = a1.Login
) AS SelfVolume
FROM dbo.Account a1
我希望子选择(【a1.Login】)中的表名与外部select语句(表a1.Login
的字段Login
)中的值Account
匹配。我怎样才能得到这个结果?
答案 0 :(得分:11)
技术答案是:使用动态SQL。它很复杂,容易出错且有潜在危险(谨防Bobby Tables)。您的SQL将变得不可读且无法维护。你正在进入痛苦的世界。
正确答案是:你没有。不要为每个用户创建单独的Orders表。使用您的帐户表的外键创建一个订单表。
如果你仍然希望继续使用这个破碎的数据库设计(请记住:你正在进入一个痛苦的世界,而你刚刚开始),你将需要以某种方式动态构建以下SQL:
SELECT SUM(ISNULL(Login_Volume,0)) FROM
(
SELECT SUM(ISNULL(Volume,0)) AS Login_Volume FROM Order_SomeUser WHERE Login = 'SomeUser'
UNION ALL
SELECT SUM(ISNULL(Volume,0)) AS Login_Volume FROM Order_SomeOtherUser WHERE Login = 'SomeOtherUser'
UNION ALL
...
) AS AllSums
您可以使用目标语言(C#,Java,PHP等)以您选择的语言执行此操作,这可能是最简单且最易维护的解决方案,或者直接在T-SQL中使用T -SQL游标和循环(=艰难的方式)。无论您选择哪种语言,算法都是直截了当的:
Account
表格并获取Login
。
Order_
表是否存在。UNION ALL
。SELECT
中。再说一次:如果有任何机会修复破坏的数据库设计,那么,将从长远来看付出
。