【发布时间】:2017-03-10 12:27:24
【问题描述】:
我仍在学习 SQL,我花了几个小时寻找我的问题的答案,但无济于事。如果这是一个骗局,请指出正确的方向!
我正在根据工作流工具生成的数据构建报告。这是我需要的结果:
| ID | Name | Company | Contract |
| 1 | John | Acme | Freelance |
| 2 | Bill | Acme | Interne |
| 3 | Mike | Duff | Salaried |
这里是主实例表“Instance_Table”:
| ID | Status | Date |
| 1 | OK | 2016-10-21 |
| 2 | Failed | 2016-10-24 |
| 3 | OK | 2016-10-25 |
这是数据所在的“Data_Table”:
| DataID | InstanceID | VariableID | Value |
| 1000 | 1 | 453 | John |
| 1001 | 1 | 879 | Acme |
| 1002 | 1 | 1879 | Freelance |
| 1003 | 1 | 98 | NULL |
| 1010 | 2 | 453 | Bill |
| 1011 | 2 | 879 | Acme |
| 1012 | 2 | 1879 | NULL |
| 1013 | 2 | 98 | INT |
| 1020 | 3 | 453 | Mike |
| 1021 | 3 | 879 | Duff |
| 1022 | 3 | 1879 | Salaried |
| 1023 | 3 | 98 | SAL |
如您所见,合约有 2 个可能的变量,1879 和 98。根据实例,仅填充一个或两个,并且 98 使用短代码而不是完整的单词。
这是我得到结果的痛苦方式:
SELECT IT.ID,
(SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 453 AND IT.ID = DT.InstanceID) as "Name",
(SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 879 AND IT.ID = DT.InstanceID) as "Company",
CASE
WHEN (SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 1897 AND IT.ID = DT.InstanceID) is NOT NULL
THEN (SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 1897 AND IT.ID = DT.InstanceID)
ELSE CASE
WHEN (SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 98 AND IT.ID = DT.InstanceID) = 'SAL'
THEN 'Salaried'
WHEN (SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 98 AND IT.ID = DT.InstanceID) = 'INT'
THEN 'Intern'
WHEN (SELECT DT.value FROM Data_Table DT
WHERE DT.VariableID = 98 AND IT.ID = DT.InstanceID) = 'FRE'
THEN 'Freelance'
ELSE '-'
END
END as "Contract"
FROM Instance_Table IT
我在问如何使用变量或其他方法简化每个子查询的重复,因为我可以想象多次查询同一个表会对性能造成巨大影响。
这个例子当然是我实际所做的一个非常简化的版本......我有大约 30 列要放入我的报告中,数据以各种形式出现,有近 70 个子查询实例,其中很多被重复。该查询的运行时间很长,如果能帮助它更快地运行,我们将不胜感激。
【问题讨论】:
-
"如您所见,合约有 2 个可能的变量,1879 和 98。"其实我完全看不出来。我根本无法遵循这一点。您能否改写一下以更清楚地说明您的意思?你在说什么?我真的看不到两个表之间有任何数据关系,可以让您确定性地得出您想要的结果。您没有向我们提供所有必要的信息。
-
你能修复你的数据结构吗?拥有这样的数据表是您永远无法轻松或以高性能方式查询的东西。如果您确实无法定义您想要的实际字段(根据我的经验,只有不到 1% 的时间是正确的),那么请使用针对此类非关系查询进行了优化的 nosql 数据库。
-
@pmbAustin 我认为这很清楚,抱歉。如果您查看 Data_Table 中的每个 InstanceID,您会看到变量 1897 和 98 发生了变化(有时为 NULL,有时是代码,有时是合约的全名)。然而,变量 483 和 879 总是以相同的方式给出常数数据。但是,我绝对可以通过我所做的查询得到我想要的日期。
-
@HLGEM 不,我无法控制数据结构。不幸的是,工作流系统是开箱即用的。
-
我仍然不知道您应用什么“逻辑”来获取表 2 和 3 并生成表 1。它看起来完全是任意的,没有您确定的规则,也没有我能做的规则想出这样一个翻译。您的问题仍然完全不清楚,甚至没有足够的信息可供任何人帮助您。
标签: sql sql-server sql-server-2012 subquery case