#sql #sql-server #tsql
Вопрос:
Я хочу выбрать 2 случайных набора данных по 3 города каждый из таблицы AdventureWorks2019 ОТ [Человек].[Адрес] и вставьте этот случайный набор данных 2*3 в одну таблицу.
Я попробовал это:
DECLARE @City TABLE
(
ID int IDENTITY ,
City nvarchar(50)
)
INSERT INTO @City (CITY)
VALUES ('Snohomish'), ('Duvall'), ('Seattle') -- Cities do select random datasets
DECLARE @ID int = (SELECT count(*) from @City)
--SELECT * FROM @City
CREATE TABLE [Person].randomtest (City nvarchar(50))
WHILE (@ID <> 0 )
BEGIN
INSERT into [Person].randomtest (City)
SELECT TOP 2 [City]
FROM [Person].[Address]
WHERE 1 = 1
AND CITY = @City.City
AND @City.ID = @ID
ORDER BY NEWID()
SET @ID = (@ID - 1)
END
Но это не работает. Они пишут «должен объявить @город». Но я уже заявил об этом.
Комментарии:
1. Вам нужно
;
в конце ваших заявлений2. В вашем
SELECT TOP 2...
вы, похоже, пытаетесь перейтиJOIN
к переменной таблицы @City, но на самом деле вы не указали, что выJOIN
входите в эту таблицу. Кроме того, пожалуйста, не используйте этоWHERE
предложение для определения вашихJOIN
условий, они должны быть вON
заявлениях, прилагаемых кJOIN
самому3. Для этого я использовал номер строки(Разбиение по городам по городам).
Ответ №1:
Они пишут «должен объявить @город». Но я уже заявил об этом.
Переменная @City
объявлена, но внутри запроса ВСТАВКИ вы используете ее без объявления выбранной таблицы.
Проблема в том , что вы неправильно используете переменную @city
, которая является таблицей типов. Если вы хотите использовать столбец из таблицы, то вам нужно ВЫБРАТЬ/ПРИСОЕДИНИТЬСЯ к таблице в поле ОТ.
Следующий запрос SELECT @City.ID
без ОТ ‘@City.ID’ не имеет смысла, так как вы используете @City.ID
, но у вас нет этой таблицы в запросе. Это именно та ошибка, которую вы здесь совершаете.
То же самое происходит, когда вы используете простые таблицы, а не только переменные. Допустим , у вас есть таблицы A и B, тогда вы не сможете выполнить такой запрос, как select a1 from A where B.b1 = 1
, поскольку B не ВЫБРАНО и, следовательно, вы не можете использовать его столбцы. Проверьте этот пример:
create table A (a1 INT)
CREATE TABLE B(b1 INT)
GO
select a1
from A -- here you declare that you select from table A. Therefore you can use the column from A
where B.b1 = 1 -- but you cannot use column from table B if you do not declared it in the query
GO -- ERROR
select a1
from A
CROSS JOIN B -- This is one option to declare table B in the query
where B.b1 = 1
GO -- Run OK
Обратите внимание! Не используйте приведенный выше запрос. Я пишу это только ради обсуждения. В вашем случае у вас есть более серьезные проблемы.
(1) Для того, чтобы использовать несколько таблиц в запросе, вам необходимо узнать об операторе ОБЪЕДИНЕНИЯ. ОБЪЕДИНЕНИЕ-это базовая операция в табличных базах данных, основанная на связях между таблицами. Существует несколько типов объединения, и вам нужно использовать тот, который соответствует вашему конкретному случаю.
Понятно, что вы не выучили язык SQL, что печально, так как его можно выучить за 3 полных дня, и у вас не возникнет таких вопросов.
Основные причины, по которым это занимает больше времени, заключаются в том, что (1) большинство людей изучают его не упорядоченно, а перескакивают с одного вопроса на другой. (2) Это не связано с тем, насколько вы умны, но большинство людей не могут учиться сами, и им нужен кто — то, кто будет их направлять-например, чтобы они не перескакивали с одной темы на другую. Вот почему у нас есть учителя.
Я НАСТОЯТЕЛЬНО рекомендую выучить полный язык на заказанном курсе. Если вы можете учиться самостоятельно, то существует несколько бесплатных онлайн-курсов (например, тот, на который я приведу ссылку ниже). Если вы видите, что это вам не подходит, тогда попробуйте книгу. Если это не сработает так же хорошо, то идите и оплатите курс — у оплаты есть еще одно преимущество (если вы заплатите, то вам не захочется тратить деньги впустую, и вы будете делать все, что вам скажут)
По следующей ссылке вы можете найти урок о ПРИСОЕДИНЕНИИ. Вы можете полениться и изучить только эту часть (как использовать несколько таблиц с помощью JOIN) или (как я предложил) оставить все в стороне -> возьмите трехдневный отпуск (или немного больше, если вам нужно) ->> >>изучите язык SQL от начала до конца, включая все упражнения.
Кроме того, у вас есть несколько проблем с вашим «запросом». Это только начало…
Подводя итог
Основная проблема заключается не в объявлении переменной в транзакции, а в вашем запросе SELECT и в том факте, что таблица переменных в запросе SELECT не объявлена.
Проверьте этот код, например:
DECLARE @City TABLE (
ID int IDENTITY ,
City nvarchar(50)
)
INSERT INTO @City (CITY)
VALUES ('Snohomish'), ('Duvall'), ('Seattle')
-- SELECT * FROM @City
DECLARE @ID int = (SELECT count(*) from @City)
WHILE (@ID <> 0 ) BEGIN
INSERT into [Person].randomtest (City)
SELECT TOP 2 a.[City]
FROM [Person].[Address] a
INNER JOIN @City c
ON a.City = c.City
WHERE 1 = 1
-- AND CITY = @City.City -- This used in the JOIN condition
AND c.ID = @ID -- not sure what you meant to get here and not sure why you use WHILE loop. NOT CLEAR WHY YOU INSERT THE SAME CITY MULTIPLE TIMES (up to two times insert the same city in each loop)
ORDER BY NEWID()
SET @ID = (@ID - 1)
END
select * from [Person].randomtest
GO
Я надеюсь, что это было полезно :-)
и что вы прочитали все, что я написал, от начала до конца, прежде чем перейти к решению, которое может не соответствовать вашим реальным потребностям