我有一个带有复合键的表,我想用该键进行SELECT查询,是否有办法将名称放入复合键或进行查询而无需添加AND
让我们说:
SELECT * FROM MyTable WHERE PRIMARY KEY = 12345
将主键作为复合键
答案 0 :(得分:1)
不,没有SELECT * FROM MyTable WHERE PRIMARY KEY ='PrimaryKeyName'的概念。换句话说,谓词(WHERE子句)不允许这样做。您需要列出谓词中复合主键中包含的所有列。
一个潜在的解决方案是构建一个存储事实表的所有主键组合的表。您可以向该表添加标识字段,并使其成为表上的外键约束。然后,您的谓词使用单个外键列。
答案 1 :(得分:0)
还有其他方法可以编写等效逻辑。例如:
where not (key1 <> val1 or key2 <> val2)
或:
select t.*
from (select t.* from t where key1 = val1) t
where t.key2 = val2
或者也许:
where t.key1 + '|' + t.key2 = val1 + '|' + val2
(假设|
不是任何值)。
或:
where (case when t.key1 <> val1 then 0
when t.key2 <> val2 then 0
else 1
end) = 1
甚至:
where (case when t.key1 = val1 then 1 end) = (case when t.key2 = val2 then 1 end)
但是使用AND
没有合理的替代方案。
我应该注意,我创建的表几乎总是将标识列作为主键。我不是复合主键的粉丝,所以你可能想要使用标识列。
答案 2 :(得分:0)
也许Computed column
是您正在寻找的东西。
简而言之,您可以使用另一列,该列是根据您的定义生成的系统(此处是复合键的每列的组合)。
然后,当您查询表时,可以查询Computed Column
。
例如,对于Charge:您有ChargeCode和ChargeAmount,这两个是复合键。然后Computed Column
将具有值(ChargeCode + ChargeAmount)。
充电示例一:ChargeCode:A ChargeAmount:100(复合键)
如果您像往常一样编写查询:
SELECT * FROM Table WHERE ChargeCode = 'A' AND ChargeAmount = '100'
如果使用Computed Column
:ComputedColumn_Key:A100(请注意此处的数据类型转换以进行字符串连接)
然后查询将是SELECT * FROM TABLE WHERE ComputedColumn_Key = 'A100'
答案 3 :(得分:0)
我结束了一个视图,在一个新列中连接复合键的列,并对该视图执行SELECT查询。
视图:
SELECT (CONVERT(VARCHAR,PK1) + CONVERT(VARCHAR, PK2)) AS NEW_ID, nameColumn FROM MyTable
查询
SELECT nameColumn FROM viewName WHERE NEW_ID = 12345