(T-SQL) Вставка нескольких записей в таблицу с повторным использованием подзапрошенного внешнего ключа для каждого - PullRequest
1 голос
/ 05 ноября 2019

Я пытаюсь создать поддерживаемый скрипт вставки для проекта, который включает в себя несколько таблиц, имеющих отношения внешнего ключа. У меня есть следующие таблицы в этом сценарии:

TABLE [dbo].[VehicleMakes]
[VehicleMakeID] [int] IDENTITY(1,1) NOT NULL,
[VehicleMakeDesc] [varchar](50) NOT NULL

TABLE [dbo].[VehicleModels]
[VehicleModelID] [int] IDENTITY(1,1) NOT NULL,
[VehicleModelDesc] [varchar](50) NOT NULL,
[VehicleMakeID] [int] NOT NULL

Для краткости я исключил ограничения внешнего ключа и т. Д., Так как меня интересует логика запроса, позволяющая мне принять это:

INSERT INTO VEHICLEMODELS (VehicleModelDesc,VehicleMakeID)
Values
('FLHTC', (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson')),
('RoadKing', (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson')),
('Softail', (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson'))

и имеют группу моделей, которые все вставлены, используя один и тот же подзапрос внешнего ключа для Make (в отличие от простого копирования / вставки этого для каждой из них)

Ответы [ 2 ]

3 голосов
/ 05 ноября 2019

Почему бы просто не сохранить MakeID в переменной и использовать его в запросе вставки:

DECLARE @MAKEID INT

SELECT @MAKEID = VehicleMakeID from VehicleMakes where VehicleMakeDesc = 'Harley-Davidson'

INSERT INTO VEHICLEMODELS (VehicleModelDesc,VehicleMakeID)
Values
('FLHTC', @MAKEID ),
('RoadKing', @MAKEID),
('Softail', @MAKEID )
0 голосов
/ 05 ноября 2019

Вместо оператора VALUES это будет лучше работать как последовательность операторов SELECT ... UNION SELECT ..., например:

INSERT INTO VEHICLEMODELS (VehicleModelDesc,VehicleMakeID)
SELECT Descr, MakeId
FROM (
    SELECT 'FLHTC' as Descr, (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson')
UNION
SELECT 'RoadKing', (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson')
UNION
SELECT 'Softail', (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson')

Кроме того, если вы собираетесь вставлять строки только для одной и той же маркив одном выражении это можно изменить, чтобы использовать логику CROSS JOIN:

INSERT INTO VEHICLEMODELS (VehicleModelDesc,VehicleMakeID)
SELECT VehicleModelDesc, VehicleMakeID
FROM (
    SELECT 'FLHTC' as VehicleModelDesc
    UNION
    SELECT 'RoadKing'
    UNION
    SELECT 'Softail'
    ) as Models
CROSS JOIN (SELECT V.VehicleMakeID from VehicleMakes as V where V.VehicleMakeDesc = 'Harley-Davidson')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...