【发布时间】:2017-07-06 17:19:28
【问题描述】:
我正在通过 Access 2010 处理 SQL Server 上的一些数据,我无法灵活更改,只能进行查询。每个单独的实体都有一个 ID,并且可能有一个跟随它的属性列表,没有特定的最大或最小条目。创建此数据集的人的解决方案是创建 37 个不同的属性列集。对于每个属性,有 4 列(尽管只有 2 列有用)。实际上,有 148 列表示可能有 37 个项目,尽管第 3 组或第 4 组之后的大多数列都是 NULL。虽然有一些一致性 - 值首先进入第一列组。只要任何一列具有空值,就可以假定它之后的每一列也是空的。如果第一列为空,则它没有属性。数据看起来有点像这样:
| ID | Attr1 | Code1 | Attr2 | Code2 | Attr3 | Code3 |
|----|-------|-------|--------|--------|--------|--------|
| 1 | Foo | 2 | Bar | 1 | (null) | (null) |
| 2 | Bar | 2 | (null) | (null) | (null) | (null) |
| 3 | Bar | 1 | Foo | 1 | Bar | 2 |
对此进行查询的最佳方法是什么,以便如果有人想要 CodeX=1(X 是任意数字),即使该行的 Code1=1 或 Code37=1,查询也会返回结果。我考虑过这样做:
A.Mod1=1
Or A.Mod2=1
Or A.Mod3=1
Or A.Mod4=1
...
但这看起来很可怕,就像山洪一样干燥。如果我想同时针对属性和代码,这变得特别可怕,我可能会这样做。我简要地查看了 CASE,希望我能想出一种方法来迭代并带回第一个空值的值,但是我的草稿没有多大意义,而且同样混乱/沉重嵌套。
除了上面建议的非常丑陋的方法之外,关于如何解决这些问题的任何想法?
【问题讨论】:
-
你能做直通查询吗?对列使用 COALESCE 关键字以相反的顺序获取列列表中的第一个非空值
-
我可以做直通,是的。那让我快速看一下。
-
好的,所以这越来越接近我的需要了。我想要执行的步骤之一是能够返回所有非空值,这样可以节省一些输入。我还希望能够匹配特定值,这意味着我每次都需要写出表达式以进行合并,因为“NOT NULL”不够有意义。然后我又回到了我的 OR 语句开始的地方。
-
如果您可以在 SQL Server 中创建视图,请创建一个以规范化数据结构,然后针对该视图进行查询。您也可以将该视图创建为 Access 查询,但性能可能会差很多。
-
很遗憾,无法将视图添加到服务器。我们只读了服务器端表,但我们可以制作本地表。我能否将列转置为具有视图的行,将每个属性映射到它自己的行?
标签: sql sql-server loops ms-access ms-access-2010