我不认为有一个简单的方法可以做到这一点,但有机会有...
我从1000万记录表中获得了大约10000条记录的列表.数据当前由各种非索引元素的查询生成.我想使用十个单独的索引字段自动构建提供相同结果的查询.
有没有一种已知的算法来构建这样的东西?除了将每个索引"节点"包含在自己的OR中的基础之外,我的意思是.
例如,假设所需的数据是:
Letter, Number
A, 1
A, 2
B, 1
C, 2
Run Code Online (Sandbox Code Playgroud)
和原始数据库有
Letter, Number
A, 1
A, 2
A, 3
B, 1
C, 1
C, 2
D, 1
D, 3
Run Code Online (Sandbox Code Playgroud)
我喜欢这样的东西:
WHERE ((Letter = 'A' OR Letter = 'B') AND (Number = 1 OR Number = 2))
OR (Letter = 'C' and Number = 2)
Run Code Online (Sandbox Code Playgroud)
或者可能
WHERE (Letter IN ('A', 'B', 'C') AND Number IN (1, 2)
AND NOT (Number = 1 AND Letter = 'C'))
Run Code Online (Sandbox Code Playgroud)
但我想我宁愿没有
WHERE (Letter = 'A' AND Number = '1') OR
(Letter = 'A' AND Number = '2') OR
(Letter = 'B' AND Number = '1') OR
(Letter = 'C' AND Number = '2')
Run Code Online (Sandbox Code Playgroud)
- 除非这里的数据库专家认为从长远来看会更加优化,对于我们所讨论的样本量.查询的运行时间很重要; 转换工具的运行时间不是.我也不一定得到'最好'的答案; "足够好"是可以接受的.
我目前的计划是通过查找可以组合在一起的事物进行计数,排序和迭代,以尽可能少地进行"分组"; 我想我宁愿没有一万(A和B和C和D和E和F和G和H和I和J)的ORed在一起.
思考?专家建议?
一种解决方案是在您不想要的情况下使用 except:
Select Letter, Number
From Table
Except
(
Select 'A', 3
Union All
Select 'C', 1
Union All
Select Distinct 'D', Number
From Table
)
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是简单地使用排除值列表填充临时表,并使用 except 来反对它。
添加
用于确定您的标准的算法的性质尚不清楚。它会查找要包含或排除的项目吗?我最初的两个解决方案假设您正在构建排除列表。但是,如果您正在构建包含列表,那么显然您可以使用 Intersect 代替。此外,您还可以使用 Values 构造函数来缩小列表:
Select Letter, Number
From Table
Intersect
Select *
From ( Values('A',1)
, ('A',2), ('A',3), ('B',1), ('C',2) )
Run Code Online (Sandbox Code Playgroud)
与 except 场景一样,使用所需的组合填充临时表并对其进行查询可能会更快。
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |