Sql 可以使用主键的内部联接吗?

Sql 可以使用主键的内部联接吗?,sql,sql-server,join,foreign-keys,primary-key,Sql,Sql Server,Join,Foreign Keys,Primary Key,我有两张一对一的桌子。表1有一个由大约4列组成的复合主键。表2的外键设置为表1的主键 尝试以下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

我有两张一对一的桌子。表1有一个由大约4列组成的复合主键。表2的外键设置为表1的主键

尝试以下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

我不能像列一样引用键吗?

不,不能像列一样引用键。您需要列出PK和FK中的所有列。。。在子
中选择
,在
中加入
on
子句中。

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

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
编辑

对评论的回应:
-
我认为键的全部意义在于避免连接列

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

主键是唯一的标识符。我可以是复合的,也可以不是复合的,但重要的是它是唯一的,不能为null


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

语句中只有一个对
fakeTable
的引用,因此这是一个错误源。您的意思是将
写为fakeTable
还是
设置column1=c1.c1
?SQL Server 2008。很好地抓住了on语句中缺少的fakeTable引用。不幸的是,这并没有解决问题。我想我需要实际引用组成键的列。我认为键的全部意义在于避免连接列!无效的对象名称“Table2”。此操作有效!非常感谢。我知道我把它复杂化了。我是否应该在每个表中创建一个新列,该列是我用来创建键的列的串联?这将有助于避免所有的和检查。@eek-一般来说,
NO
。如果单个字段单独表示某个内容,请保持原样。将多个项填充到同一字段是一种SQL反模式,并且在将来常常会导致更多的问题。我主张的最接近的方法是在表1中有另一个标识列,并提供外键。您仍然可以在4个标识字段上放置一个唯一的键。这称为代理键(替代复合键的另一个键)。不过,如果您添加了一个标识列以简化连接,请确保在最初作为主键的四列上放置唯一索引!您是否建议连接列,这样我就不必列出这么多AND运算符?@eek142我不建议。。。相反,我建议Dems在
IDENTITY
列中添加第二个建议。