2 подзапроса в значениях операторов вставки в MS SQL Server Compact Edition 4.0
В частности, я использую SQL Server Compact 4.0, если это имеет значение. У меня есть 3 таблицы (примечание,userTable, стих). таблица user и verse не имеет никакой корреляции, кроме как в этой таблице примечаний, поэтому я не могу сделать один подзапрос, соединяющий две таблицы.
INSERT INTO [note]
([verse_id]
,[user_id]
,[text]
,[date_created]
,[date_modified])
VALUES
( (SELECT Id FROM verse
WHERE volume_lds_url = 'ot'
AND book_lds_url = 'gen'
AND chapter_number = 8
AND verse_number = 16)
, (SELECT Id FROM userTable
WHERE username = 'canichols2')
,'test message'
,GETDATE()
,GETDATE());
GO
Насколько я могу сказать, утверждение должно работать. Внешние операторы работают нормально, если я жестко кодирую значения внешнего ключа, и каждый из подзапросов работает так, как должен, и возвращает только один столбец и одну строку каждый.
Сообщение об ошибке:There was an error parsing the query. [ Token line number = 8,Token line offset = 14,Token in error = SELECT ]
Так что ему не нравится подзапрос в предложении скалярных значений, но я не могу понять, как использовать
INSERT INTO .... SELECT ....
Выписка с 2 разных таблиц.
Табличные Определения
Так как @Prasanna попросил об этом, вот определения
CREATE TABLE [userTable] (
[Id] int IDENTITY (1,1) NOT NULL
, [username] nvarchar(100) NOT NULL
, [email] nvarchar(100) NOT NULL
, [password] nvarchar(100) NULL
);
GO
ALTER TABLE [userTable] ADD CONSTRAINT [PK_user] PRIMARY KEY ([Id]);
GO
CREATE TABLE [note] (
[Id] int IDENTITY (1,1) NOT NULL
, [verse_id] int NULL
, [user_id] int NULL
, [text] nvarchar(4000) NOT NULL
, [date_created] datetime DEFAULT GETDATE() NOT NULL
, [date_modified] datetime NULL
);
GO
ALTER TABLE [note] ADD CONSTRAINT [PK_note] PRIMARY KEY ([Id]);
GO
CREATE TABLE [verse] (
[Id] int IDENTITY (1,1) NOT NULL
, [volume_id] int NULL
, [book_id] int NULL
, [chapter_id] int NULL
, [verse_id] int NULL
, [volume_title] nvarchar(100) NULL
, [book_title] nvarchar(100) NULL
, [volume_long_title] nvarchar(100) NULL
, [book_long_title] nvarchar(100) NULL
, [volume_subtitle] nvarchar(100) NULL
, [book_subtitle] nvarchar(100) NULL
, [volume_short_title] nvarchar(100) NULL
, [book_short_title] nvarchar(100) NULL
, [volume_lds_url] nvarchar(100) NULL
, [book_lds_url] nvarchar(100) NULL
, [chapter_number] int NULL
, [verse_number] int NULL
, [scripture_text] nvarchar(4000) NULL
);
GO
ALTER TABLE [verse] ADD CONSTRAINT [PK_scriptures] PRIMARY KEY ([Id]);
GO
Я знаю, что это не первая нормальная форма или что-то в этом роде, но вот как это было дано мне, и мне не хотелось делить это на несколько таблиц.
Результаты подзапроса
Чтобы показать результаты и как там только 1 строка.
SELECT Id FROM WHERE volume_lds_url = 'ot'
AND book_lds_url = 'gen'
AND chapter_number = 8
AND verse_number = 16
Я бы
200
И второй подзапрос
SELECT Id FROM userTable
WHERE username = 'canichols2'
Я бы
1
1 ответ
Внимание: целевой системой является SQL-Server-Compact-CE-4
Этот младший брат, похоже, не поддерживает ни подвыборы в качестве скалярных значений, ни объявленные переменные. Найти подробности в комментариях...
Подход 1
Пока вы можете быть уверены, что суб-выборка возвращает ровно одно скалярное значение, преобразование должно быть легко VALUES
к SELECT
, Попробуй это:
INSERT INTO [note]
([verse_id]
,[user_id]
,[text]
,[date_created]
,[date_modified])
SELECT
(SELECT Id FROM verse
WHERE volume_lds_url = 'ot'
AND book_lds_url = 'gen'
AND chapter_number = 8
AND verse_number = 16)
, (SELECT Id FROM userTable
WHERE username = 'canichols2')
,'test message'
,GETDATE()
,GETDATE();
Подход 2
Нет опыта работы с компактными выпусками SQL-Server, но вы можете попробовать это:
DECLARE @id1 INT=(SELECT Id FROM verse
WHERE volume_lds_url = 'ot'
AND book_lds_url = 'gen'
AND chapter_number = 8
AND verse_number = 16);
DECLARE @id2 INT=(SELECT Id FROM userTable
WHERE username = 'canichols2');
INSERT INTO [note]
([verse_id]
,[user_id]
,[text]
,[date_created]
,[date_modified])
SELECT @id1
,@id2
,'test message'
,GETDATE()
,GETDATE();