ВЫБЕРИТЕ случайные наборы данных из базы данных AdventureWorks

#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
 

Я надеюсь, что это было полезно :-) и что вы прочитали все, что я написал, от начала до конца, прежде чем перейти к решению, которое может не соответствовать вашим реальным потребностям