如何使用复合键进行SELECT?

时间:2018-04-04 14:56:56

标签: sql sql-server sql-server-2008 select composite-primary-key

我有一个带有复合键的表,我想用该键进行SELECT查询,是否有办法将名称放入复合键或进行查询而无需添加AND

让我们说:

SELECT * FROM MyTable WHERE PRIMARY KEY = 12345

将主键作为复合键

4 个答案:

答案 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