От новичка до гуру: Курсы программирования на CyberDuff

Можете ли вы использовать INNER JOIN с первичным ключом?

У меня есть две таблицы с отношением один к одному. 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

Разве мне не разрешено ссылаться на ключи, как если бы они были столбцами?


  • В операторе есть только одна ссылка на fakeTable, так что это один из источников ошибки. Вы хотели написать AS fakeTable или SET column1 = c1.c1? 14.02.2012
  • SQL Server 2008. Хорошая зацепка по отсутствующей ссылке на fakeTable в операторе ON. К сожалению, это не исправило ситуацию. Я думаю, мне нужно на самом деле ссылаться на столбцы, которые составляют ключи. Я думал, что весь смысл ключей в том, чтобы избежать объединения столбцов! 14.02.2012
  • Недопустимое имя объекта "Таблица2". 14.02.2012

Ответы:


1

Нет, вам нужно перечислить все поля по отдельности. Но вы можете избежать подзапроса, который у вас есть...

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!

Ключи — это не устройство для экономии времени, а устройство целостности данных.

Первичный ключ — это уникальный идентификатор. Я могу быть составным или нет, но важно то, что он уникален и не может быть обнулен.

Внешний ключ также является средством обеспечения целостности данных. Это гарантирует, что если данные ссылаются на что-то в другой таблице, они фактически должны существовать в этой другой таблице.

14.02.2012
  • Это сработало! Спасибо. Я знал, что усложняю. Должен ли я создавать новый столбец в каждой таблице, который представляет собой конкатенацию столбцов, которые я использовал для создания ключей? Это помогло бы избежать всех проверок AND. 14.02.2012
  • @eek - В общем, NO. Если отдельные поля что-то значат по отдельности, оставайтесь такими, какие есть. Введение нескольких элементов в одно и то же поле — это анти-шаблон SQL, который часто вызывает в будущем больше проблем, чем того стоит. Самый близкий подход, который я бы рекомендовал, - это иметь еще один столбец IDENTITY в таблице 1 и внешний ключ к нему. Вы можете по-прежнему поместить уникальный ключ в 4 поля идентификации. Это называется суррогатным ключом (другим ключом вместо составного ключа). 14.02.2012
  • Тем не менее, если вы добавляете столбец идентификаторов, чтобы упростить объединение, не забудьте указать уникальный индекс для четырех столбцов, которые изначально были вашим первичным ключом! 14.02.2012

  • 2

    Нет, вы не можете ссылаться на ключи, как если бы они были столбцами. Вам нужно будет перечислить все столбцы как в PK, так и в FK... как в вашем подразделе select, так и в вашем предложении join on.

    14.02.2012
  • Вы рекомендуете объединить столбцы, чтобы мне не приходилось перечислять так много операторов И? 14.02.2012
  • @ eek142 Я бы не рекомендовал этого ... вместо этого я бы поддержал предложение Демса для столбца IDENTITY. 14.02.2012
  • Новые материалы

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..

    Как работает дистанционное парное программирование и почему оно может изменить вашу жизнь
    Серебряная пуля от одиночества и отвлекающих факторов во время обучения программированию Независимо от того, работаете ли вы или учитесь удаленно, велика вероятность, что одиночество и..

    🔥🔥👉Питон 🆚Javascript👈🔥🔥
    Сегодня Python и Javascript потрясают мир в области ИТ. Все хотят выучить Python и Javascript, чтобы получить высокооплачиваемую работу. Различные фреймворки Python и Javascript расширяют..