0

假设您有一个包含许多属性字段的表,例如:

ID
约会时间
q
一个
C
d
.
.
.
(ETC)

其中 q,a,c,d 等表示不定数量的 int 字段,其名称是生成的(也在运行时创建)

在某些特定字段是特定数字而所有其他字段都是 0 的约束下,您如何选择?

(例如)a=1,c=5,其他都是0?


更新:

我想我要问的是是否有一些“整体”功能或者我可以去“WHERE ALL OTHERS = 0”(或类似的东西)的东西。

规范化的问题是,即使在连接之后,我仍然必须检查特定的非零值以及所有其他字段(或规范化字段)是否为 0。


具体应用:

化合物表

ID
姓名
C
铁
氯
H
.
.
.
(等 - 当新的复合插入包含未列出的元素时添加字段)

示例行:

名称 = 盐酸
C = 0
铁 = 0
氯 = 1
H = 1
.
.
.
(其他一切= 0)

简单的问题SELECT * FROM table WHERE H=1 AND Cl = 1在于它还包括其他情况,例如 C Cl H(即使 C=1,它也被选中,因为 Cl 和 H 也都是 1)

这就是为什么我试图弄清楚如何在所有其他字段都为 0 的情况下选择它!

4

3 回答 3

1

这不是一个现实的情况。您永远不会有无限数量的 int 字段,因为您不能只修改没有 ALTER 语句的表(仅在运行时)。至少,你不应该。

于 2011-12-28T01:04:37.630 回答
1

您实际上不能在表中拥有无限数量的列 - 您被限制在一个确定的数量上。在这种情况下,您只需使用:

... where a = 1 and c = 5 and q = 0 and b = 0 and d = 0 and ...

如果您只是表示数量是确定的,但应用程序使用的列数可能会发生变化,那么查询也需要在运行时使用相同的信息生成。例如,如果d在运行时未使用,它将被排除在查询之外。

但这是一个设计得很糟糕的表,您应该考虑对其进行更好的规范化,例如将这些属性转移到一个单独的表中(这个新表中每行一个属性)并将它们链接回带有id字段的原始表,例如:

BaseTable:
    id          integer        primary key
    datetime    timestamp
OtherTable:
    id          integer        references BaseTable(id)
    attribute   char(1)
    text        varchar(50)
    primary key (id,attribute)

这种模式将允许每个id.


根据您基于某些外部因素更改表的评论,我认为这就是我们在 DBA 世界中所说的“有趣”的设计决策:-)

我强烈建议不要这样做,但是,如果您认为可以忽略该建议,您可以在大多数 DBA 实现中获取元数据。

例如,MySQL在架构中有一个COLUMNS表,您可以使用它来枚举给定表的所有列。INFORMATION_SCHEMA使用它,您可以基于任意复杂的表动态构造有效的 SQL 语句。

并不是说这是一个主意,只是说这是可能的。

于 2011-12-28T01:09:23.083 回答
0

你构造这样的东西:

WHERE a=1
  AND c=5
  AND d=0
  AND e=0
  ...

或这个:

WHERE (a, c, d, e, ...) =
      (1, 5, 0, 0, ...)

没有什么像:

WHERE ALL OTHERS = 0

如果您反复更改表结构,您也应该动态更改查询。但这不是一个好的设计。您应该规范化表(可能通过将表拆分为 2 个表并将重复的列更改为一列,以便数据从多列变为一列但多行)。


OP编辑后更新

化合物的可能标准化 - 元素:

Compound
--------
CompoundId   Int          Primary Key
Name         Varchar(250) Unique
...other stuff

Element
-------
ElementCode  Char(2)      Primary Key
Name         Varchar(50)  Unique 

Structure
---------
CompoundId   Int 
ElementCode  Char(2) 
Ratio        Int
Primary Key (CompoundId, ElementCode) 
Foreign Key (CompoundId)
  References Compound(CompoundId)
Foreign Key (ElementCode)
  References Element(ElementCode)

带有样本数据:

CompoundId  Name 
------------------------------
 1          Hydrochloric acid
 2          Water
 3          Glucose

ElementCode  Name 
---------------------
 H           Hydrogen
 C           Carbon
 O           Oxygen 
 Cl          Chlorium 

CompoundId  ElementCode  Ratio 
------------------------------
 1           H            1
 1           Cl           1 
 2           H            2
 2           O            1
 3           H            12
 3           C            6
 3           O            6
于 2011-12-28T01:09:54.580 回答