假设您有一个包含许多属性字段的表,例如:
id datetime q a c d . . . (etc)
其中q,a,c,d等表示无限数量的int字段,其名称生成(也在运行时创建)
如何使用约束选择某些特定字段是特定数字而其他所有字段都是0?
(例如)a = 1,c = 5,其他所有都是0?
更新
我想我要求的是,如果有一些“整体”功能或其他我可以去“其他所有人= 0”(或类似的东西)。
规范化的问题是,即使在连接之后,我仍然需要检查特定的非零值以及所有其他字段(或规范化字段)是否为0.
具体应用:
化合物表
id name C Fe Cl H . . . (etc - fields are added when new compound insert contains elements not listed)
示例行:
name = Hydrochloric acid C = 0 Fe = 0 Cl = 1 H = 1 . . . (everything else = 0)
具有简单SELECT * FROM table WHERE H=1 AND Cl = 1
的问题在于它还包括其他情况,例如C Cl H(即使它具有C = 1,也选择它,因为Cl和H都是1)< / p>
这就是为什么我想弄清楚如何在所有其他字段为0的情况下选择它!
答案 0 :(得分:1)
这不是一个现实的情况。您将永远不会有无限数量的int字段,因为您不能仅在没有ALTER语句的情况下修改表(仅在运行时)。至少,你不应该。
答案 1 :(得分:1)
您实际上不能在表格中拥有无限数量的列 - 您只能使用明确的数量。在这种情况下,您只需使用:
... where a = 1 and c = 5 and q = 0 and b = 0 and d = 0 and ...
如果您只是意味着数量是明确的,但应用程序使用的列数可能会发生变化,那么查询也需要在运行时使用相同的信息生成。例如,如果在运行时未使用d
,则它将不在查询范围内。
但这是一个设计非常糟糕的表,您应该考虑更好地对其进行规范化,例如将这些属性转移到单独的表(此新表中每行一个属性)并使用{{将它们链接回原始表) 1}}字段,例如:
id
这种架构将允许每个BaseTable:
id integer primary key
datetime timestamp
OtherTable:
id integer references BaseTable(id)
attribute char(1)
text varchar(50)
primary key (id,attribute)
上的任意属性。
根据您的评论,基于某些外部因素,您正在改变表格,我认为这是我们DBA世界中所谓的“有趣”设计决策: - )
我强烈反对这一点,但是,如果您认为忽略该建议,则可以在大多数DBA实现中获取元数据。
例如,MySQL在id
架构中有COLUMNS
table,您可以使用它来枚举给定表的所有列。使用它,您可以基于任意复杂的表动态构造有效的SQL语句。
不是说这是好的想法,只是有可能。
答案 2 :(得分: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