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();
Другие вопросы по тегам