你能用INNER JOIN和主键吗?

时间:2012-02-14 17:13:37

标签: sql sql-server join foreign-keys primary-key

我有两张一对一的关系表。 Table1有一个由大约4列组成的复合主键。 Table2的外键设置为Table1的主键。

当我尝试以下UPDATE子句时,出现错误:

UPDATE Table2
SET column1 = fakeTable.c1
FROM Table2 INNER JOIN
    (
        SELECT Table1.primaryKey
        , (Table1.column3 + Table1.column4) AS c1
        FROM Table1
    ) AS c1
ON Table2.foreignKey = fakeTable.primaryKey

我是否不允许引用键,就像它们是列一样?

2 个答案:

答案 0 :(得分:4)

不,您需要单独列出所有字段。但是你可以避免你拥有的子查询...

UPDATE
  Table2
SET
  column1 = Table1.column3 + Table1.column4
FROM
  Table2
INNER JOIN
  Table1
    ON  Table2.foreignKey1 = Table1.primaryKey1
    AND Table2.foreignKey2 = Table1.primaryKey2
    AND Table2.foreignKey3 = Table1.primaryKey3
    AND Table2.foreignKey4 = Table1.primaryKey4

编辑

对评论的回应:
- I thought the whole point of keys was to avoid having to concatenate columns!

密钥不是节省时间的设备,它们是数据完整性设备。

主键是唯一标识符。我可以是一个复合或不复合,但重要的是它是独特的而不是可空的。

外键也是数据完整性设备。它确保如果数据引用另一个表中的某些内容,它实际上必须存在于另一个表中。

答案 1 :(得分:2)

不,您不能像引用列那样引用键。您需要在子selectjoin的{​​{1}}子句中列出PK和FK中的所有列。