SQL виключає стовпчик, використовуючи SELECT * [крім колонкиA] З таблиціA?


733

Всі ми знаємо, що для вибору всіх стовпців із таблиці ми можемо використовувати

SELECT * FROM tableA

Чи є спосіб виключити стовпці (таблиці) з таблиці, не вказуючи всі стовпці?

SELECT * [except columnA] FROM tableA

Єдиний спосіб, який я знаю, - це вручну вказати всі стовпці та виключити небажаний стовпчик. Це дійсно забирає багато часу, тому я шукаю способи заощадити час та зусилля на це, а також для подальшого обслуговування, якщо в таблиці є більше / менше стовпців.


27
Було б дуже зручно мати цю функцію не для введення виробничого коду, а для усунення несправностей. Приклад: У мене є таблиця з кількома стовпцями, які я запитую, але я хочу швидко опустити текстовий стовпчик або два.
Міхей Б.

У мене була потреба в цьому під час роботи з openquery (хоча мені потрібна функціональність в MySQL, а не SQL Server). Мені довелося запитувати базу даних MySQL за допомогою SQL Server. Оскільки в таблиці MySQL були стовпці з фіксованою шириною, я не міг використати SELECT *запит (у OLE DB є проблеми з відображенням цих). Я не міг вказати правильні стовпці, оскільки не мав прямого доступу до бази даних MySQL, однак SQL Server був досить люб’язний, щоб повідомити мені про назви стовпців із фіксованою шириною char ...
jahu

2
Я хотів би додати ще одну причину для цього: SELECT DISTINCT *за винятком того, що стовпець клавіш може працювати без повторюваних рядків, створений іншим
unrline

1
Я згоден, що це забирає багато часу. Ось чому я зазвичай просто клацаю правою кнопкою миші на таблиці, вибираю "вибрати верхній 1000 рядків", а потім видаляю стовпці, які я не хочу.
ThomasRones

2
не забувати: у багатьох випадках розробник не знає стовпців, оскільки вони можуть змінюватися. це характерно для сховищ даних. через 6 місяців вони додають додатковий стовпчик, і його слід вибирати, не змінюючи код.

Відповіді:


446

Я згоден з усіма ... але якщо я збирався зробити щось подібне, я міг би зробити це так:

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

222
Неефективна ... але дуже креативна :)
Гільєрмо Гутьеррес

1
Гарний. Мені часто потрібно включити приєднання двох темп-таблиць або темп до іншої таблиці, де мені не потрібні всі стовпці в темпі, особливо тому, що буде задіяно групування.
VISQL

2
Дуже хороший. Звичайно вирішує проблему вилучення назв стовпців.
Тостер

1
@CeesTimmerman - якщо у вас є запит із дублюючими іменами стовпців, це окрема проблема, Зважаючи на те, який підхід ви приймаєте. "Перейменування стовпців SQL" Google або "Псевдонім SQL стовпців". Щось подібне SELECT table1.ID AS table1ID ..., ІІРК.
ToolmakerSteve

3
@ToolmakerSteve Ідея цього питання полягає лише в тому, щоб вказати стовпці, які вам не потрібні. Іменування стовпців потребує вказівки всіх, скажімо, 20+ стовпців певної таблиці.
Cees Timmerman

289

Ні.

Найкраща практика технічного обслуговування - вказувати лише необхідні стовпці.

Принаймні 2 причини:

  • Це робить ваш контракт між клієнтом та базою даних стабільним. Однакові дані щоразу
  • Продуктивність, що охоплює індекси

Редагувати (липень 2011 р.):

Якщо перетягнути з Object Explorer Columnsвузол для таблиці, він додає список CSV-стовпців у вікно запиту для вас, що досягає однієї з ваших цілей


3
я ніколи не знав, що про перетягування collumn дякую, GBN, ви знову врятували день. ви повинні заробити багато $$ завдяки вашим знанням sql
l --'''''--------- '' '' '' '' '' '21

4
є дійсні сценарії з SELECT *, особливо в ETL підпрограми. Я думаю, що найкраща відповідь тут - одна з динамічним SQL.
mishkin

1
Бувають випадки, коли ви хочете вибрати всі дані для студента для статистичного дослідження, але не збивати з себе ідентифікатор студента для зміцнення конфіденційності
Джордж Бірбіліс

3
"вкажіть лише необхідні стовпці" - відсутність жорсткого кодування
RM Haley

9
Хоча такі відповіді отримують багато голосів, наскільки я не маю значення. Концептуально можливість "Вибрати * крім ABC" не є більш проблематичним, ніж "Select *", який підтримує мова. ОП чітко просить способу щось досягти. Людина, відповідаючи на це запитання, не може знати, чи бажає ОП використовувати це у виробничому коді, чи у них просто негайно потрібно запустити такий запит під час розробки якогось коду для бази даних, тому лекція про хороші стандарти не сприяє взагалі ніякої цінності.
Itme2003

68

Якщо ви не хочете , щоб написати ім'я кожного стовпця вручну , ви можете використовувати , Script Table Asклацнувши правою кнопкою миші на столі або зору в SSMS , як це:

введіть тут опис зображення

Тоді ви отримаєте весь запит на вибір у вікні редактора нових запитів, а потім видаліть небажаний стовпець, як це:

введіть тут опис зображення

Зроблено


2
Це простіше, ніж вибирати всі назви стовпців, а потім додавати до них коми.
shaijut

68

Автоматизований спосіб зробити це в SQL (SQL Server):

declare @cols varchar(max), @query varchar(max);
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'MyTable'
            )
            and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']';

SELECT @query = 'select ' + @cols + ' from MyTable';  
EXEC (@query);

Що робити, якщо ви запитуєте за результатами CTE або іншого підпиту? Простий приклад: ви можете зробити підзапит, який додає результат row_number()до кожного рядка, а потім виконати з'єднання row_number, а потім вибрати все, що виключаєrow_number результат від з'єднання.
Елі

43

Ви можете створити подання, у якому є стовпці, які ви бажаєте вибрати, тоді ви можете просто select *з подання ...


8
Спочатку моя реакція була "як це легше, ніж просто вказати стовпці"? Але тоді я вирішив, що з точки зору технічного обслуговування це може бути поліпшення.
ToolmakerSteve

1
Це також підтримує оптимізатор запитів, а не протидіювати його тимчасовій таблиці або динамічному SQL.
підкреслюю

30

Так, це можливо (але не рекомендується).

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

Пояснення коду :

  1. Оголосіть змінну, щоб зберігати розділений комою список імен стовпців. Це налаштування за замовчуванням до NULL.
  2. Використовуйте системний вигляд для визначення назв стовпців у нашій таблиці.
  3. Використовуйте SELECT @variable = @variable + ... FROMдля об'єднання назв стовпців. Цей тип SELECTне повертає набір результатів. Це, можливо, недокументоване поведінка, але працює у кожній версії SQL Server. В якості альтернативи ви можете використовувати SET @variable = (SELECT ... FOR XML PATH(''))для об'єднання рядків.
  4. Використовуйте ISNULLфункцію, щоб додати кому, лише якщо це не перша назва стовпця. Використовуйте QUOTENAMEфункцію для підтримки пробілів та розділових знаків у назвах стовпців.
  5. Використовуйте WHEREпункт, щоб приховати стовпці, які ми не хочемо бачити.
  6. Використовуйте EXEC (@variable), також відомий як динамічний SQL , для вирішення імен стовпців під час виконання. Це потрібно, оскільки ми не знаємо назви стовпців під час компіляції.

Дякую! Це було ключем до вирішення моєї проблеми .
Антоніо

У мене є одне запитання: з якої причини другий вибір повинен бути внесений до заяви EXEC? Я бачив, що це ефективно потрібно, але мені цікаво, чому я не можу просто написатиSELECT @columns FROM contact
Антоніо

17

Як і інші, сказали, що це не існує, але якщо ви використовуєте сервер Sql, хитрість, яку я використовую, - це змінити вихід на розділені комами, тоді зробіть

select top 1 * from table

і виріжте весь список стовпців з вікна виводу. Потім ви можете вибрати, які стовпці ви хочете, не вводячи їх усі.


13
Дивіться мій підказку щодо перетягування з
SSMS

11

По суті, ви не можете робити те, що хотіли, - але ви можете отримати правильні інструменти, які допоможуть вам зробити речі трохи простішими.

Якщо ви подивитесь на SQL-підказку Red-Gate , ви можете ввести "SELECT * FROM MyTable", а потім перемістити курсор назад після "*" і натисніть <TAB>, щоб розгорнути список полів і видалити ці кілька полів, які ви не потрібно.

Це не ідеальне рішення - але прокляте гарне! :-) Шкода, що Intellisense студії управління MS SQL Server все ще недостатньо розумний, щоб пропонувати цю функцію .......

Марк


Це добре, але проблема в тому, що ваш запит може стати величезним. Було б непогано мати функцію "крім", не для коду prod, а спеціального запиту.
Міхей Б.

8

ні, немає способу це зробити. можливо, ви можете створити власні представлення даних, якщо це можливо у вашій ситуації

EDIT Можливо, якщо ваша БД підтримує виконання динамічного sql u, може написати SP і передати стовпці, які не хочуть бачити, і дозволити динамічно створювати запит і повертати вам результат. Я думаю, що це можливо в SQL Server як мінімум


13
Це можливо, але я б звільнив людину, яка це робила.
Лівен Кірсмейкерс

Класична проблема очищення: Скопіюйте dfata, який ви хочете зберегти, у тимчасовий стіл, обрізати велику, заново заповнити таблицю темп. Потрібно виключити стовпчик особи.
Волкер

8

Якщо ви використовуєте Studio SQL Server Management Studio, виконайте наступне:

  1. Введіть потрібну назву таблиць і виберіть її
  2. Натисніть Alt+F1
  3. o / p показує стовпці в табл.
  4. Виберіть потрібні стовпці
  5. Скопіюйте та вставте ті, які ви вибрали
  6. Запустити запит.

Насолоджуйтесь.


7

У студії управління SQL ви можете розширити стовпці в Провіднику об’єктів, а потім перетягнути Columnsелемент дерева у вікно запиту, щоб отримати список розділених комами комах.


6

Підсумовуючи це, ви не можете цього зробити, але я не погоджуюся з усіма коментарями вище, є "є" сценарії, де ви можете законно використовувати * Коли ви створюєте вкладений запит, щоб вибрати певний діапазон із цілого списку (наприклад, paging) чому б у світі хотілося вказати кожен стовпець у зовнішньому операторі select, коли ви це зробили у внутрішньому?


Чи можете ви використовувати деякі варіанти "внутрішнього імені.
ToolmakerSteve

6
DECLARE @SQL VARCHAR(max), @TableName sysname = 'YourTableName'

SELECT @SQL = COALESCE(@SQL + ', ', '') + Name 
FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID(@TableName)
AND name NOT IN ('Not This', 'Or that');

SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @TableName

EXEC (@SQL)

ОНОВЛЕННЯ:

Ви також можете створити збережену процедуру для вирішення цього завдання, якщо ви використовуєте його частіше. У цьому прикладі я використав вбудований STRING_SPLIT (), який доступний на SQL Server 2016+, але якщо вам потрібно, є безліч прикладів того, як його створити вручну на SO.

CREATE PROCEDURE [usp_select_without]
@schema_name sysname = N'dbo',
@table_name sysname,
@list_of_columns_excluded nvarchar(max),
@separator nchar(1) = N','
AS
BEGIN
 DECLARE 
 @SQL nvarchar(max),
 @full_table_name nvarchar(max) = CONCAT(@schema_name, N'.', @table_name);

 SELECT @SQL = COALESCE(@SQL + ', ', '') + QUOTENAME([Name])
 FROM sys.columns sc
 LEFT JOIN STRING_SPLIT(@list_of_columns_excluded, @separator) ss ON sc.[name] = ss.[value]
 WHERE sc.OBJECT_ID = OBJECT_ID(@full_table_name, N'u')
 AND ss.[value] IS NULL;

 SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
 EXEC(@SQL)
END

А потім просто:

EXEC [usp_select_without] 
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';

5

Якщо ми говоримо про Процедури, він працює з цим трюком для створення нового запиту та ВИКОНУЙ НЕЗАДАЧНО :

SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
INTO var_list_of_columns
FROM ALL_TAB_COLUMNS
WHERE table_name = 'PUT_HERE_YOUR_TABLE'
AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');

5

Чи є спосіб виключити стовпці (таблиці) з таблиці, не вказуючи всі стовпці?

Використання декларативного SQL звичайним способом, ні.

Я думаю, що запропонований вами синтаксис гідний і хороший. Насправді мова реляційної бази даних "Підручник D" має дуже схожий синтаксис, де за ключовими словами ALL BUTслідує набір атрибутів (стовпців).

Однак SQL SELECT *вже отримує неабияку помилку (@ відповідь Гуффи тут є типовим запереченням), тому я не думаю, що SELECT ALL BUTнезабаром потрапить у стандарт SQL.

Я думаю, що найкраща «робота навколо» - це створення VIEWлише тих стовпців, яких ви хочете SELECT * FROM ThatView.


1
@underscore_d: Зараз я переглянув свою відповідь.
день, коли

Класно, я згоден з вашими останніми 2 абзацами. Інформація про Підручник D цікава, хоча я схильний погоджуватися з тими, хто вважає select *, що сумнівно - дуже корисно для спеціальних речей та програм, які потребують загальної обробки таблиць даних, але не стільки для побудови (за браком кращого слова) 'чисті' запити. Тим не менш, те, що не входить до стандарту ANSI, не означає, що Microsoft не може додати його до свого діалекту, як і у багатьох інших речах, але я скептично налаштований.
підкреслюю

5

Сучасний діалект SQL, як BigQuery, пропонує чудове рішення

SELECT * EXCEPT (ColumnNameX, [ColumnNameY, ...])

Це дуже потужний синтаксис SQL, щоб уникнути довгого списку стовпців, які потрібно постійно оновлювати через зміни назви стовпців таблиці. І ця функціональність відсутня в поточній реалізації SQL Server, що шкода. Сподіваємось, одного дня Microsoft Azure стане більш привабливим для даних.

Науковці даних люблять мати можливість швидкої можливості скоротити запит і мати змогу видалити деякі стовпці (через дублювання чи з будь-якої іншої причини).

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers


4

Postgres sql має спосіб це зробити

pls посилайтеся: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

Інформаційна схема

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
        FROM information_schema.columns As c
            WHERE table_name = 'officepark' 
            AND  c.column_name NOT IN('officeparkid', 'contractor')
    ), ',') || ' FROM officepark As o' As sqlstmt

Наведене вище для мого конкретного прикладу таблиці - генерує оператор sql, який виглядає приблизно так

ВИБІРИТЕ o.officepark, o.owner, o.squarefootage ІЗ officepark As o


Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Бхаргав Рао

3

Я не знаю жодної бази даних, яка це підтримує (SQL Server, MySQL, Oracle, PostgreSQL). Це, безумовно, не є частиною стандартів SQL, тому я думаю, що вам потрібно вказати лише потрібні стовпці.

Звичайно, ви можете динамічно будувати свій SQL-оператор і змусити його виконати сервер. Але це відкриває можливість для ін'єкції SQL ..


3

Я знаю, що це трохи старе, але я просто зіткнувся з тим же питанням і шукав відповіді. Тоді я мав старшого розробника показати мені дуже просту хитрість.

Якщо ви використовуєте редактор запитів студії управління, розгорніть базу даних, а потім розгорніть таблицю, яку ви вибираєте, щоб ви могли бачити папку стовпців.

У вашому операторі вибору просто виділіть папку з посиланням на стовпці вище та перетягніть її у вікно запиту. Він вставить усі стовпці таблиці, а потім просто видаліть стовпчик ідентичності зі списку стовпців ...


1
Так, але що, якщо у вас є 5 приєднань, ідея повинна була б зробитиSELECT * Except(tableName.ColumnName) FROM ...
Pawel Cioch

Я вважаю це корисним :) Я про це не знав, але це не відповідь на питання теми.
Fka

3

Найкращий спосіб вирішити це - за допомогою перегляду ви можете створити подання з необхідними стовпцями та отримати дані з нього

example

mysql> SELECT * FROM calls;
+----+------------+---------+
| id | date       | user_id |
+----+------------+---------+
|  1 | 2016-06-22 |       1 |
|  2 | 2016-06-22 |    NULL |
|  3 | 2016-06-22 |    NULL |
|  4 | 2016-06-23 |       2 |
|  5 | 2016-06-23 |       1 |
|  6 | 2016-06-23 |       1 |
|  7 | 2016-06-23 |    NULL |
+----+------------+---------+
7 rows in set (0.06 sec)

mysql> CREATE VIEW C_VIEW AS
    ->     SELECT id,date from calls;
Query OK, 0 rows affected (0.20 sec)

mysql> select * from C_VIEW;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2016-06-22 |
|  2 | 2016-06-22 |
|  3 | 2016-06-22 |
|  4 | 2016-06-23 |
|  5 | 2016-06-23 |
|  6 | 2016-06-23 |
|  7 | 2016-06-23 |
+----+------------+
7 rows in set (0.00 sec)

3
Що робити, якщо кількість стовпців велика, скажімо, 100 і ми хотіли ВИБІРАТИ всі стовпці, але один. Чи є кращий підхід?
KartikKannapur

5
Цей вид пропускає суть. Ви вибираєте "id, дата" у другому дзвінку, який, якщо ви збиралися зробити це, просто зробіть це в першу чергу.
keithpjolley

3

Якщо ви хочете виключити чутливий стовпець регістру, наприклад пароль, я роблю це, щоб приховати значення:

SELECT * , "" as password FROM tableName;


цей працював на мене
Арун Прасад Е. С.

1
Хоча, звичайно, ніколи не зберігайте паролі з чіткими текстами у своїй базі даних. Принаймні , вони повинні бути хешірованного з сіллю і перцем , можливо , security.stackexchange.com/questions/3272 / ...
Anders_K

2

Що ж, звичайна найкраща практика визначати, які стовпці ви хочете, а не просто вказувати *. Тож слід просто вказати, у які поля ви хочете повернути свій вибір.


2

Колегія радила гарну альтернативу:

  • В SELECT INTO у попередньому запиті (де ви генеруєте або отримуєте дані) в таблицю (яку ви видалите, коли буде зроблено). Це створить структуру для вас.
  • Зробіть сценарій як СТВОРИТИ в новому вікні запиту.
  • Видаліть небажані стовпці. Відформатуйте решту стовпців у 1 вкладиші та вставте як список стовпців.
  • Видаліть створену вами таблицю.

Готово ...

Це нам дуже допомогло.


1

Клацніть правою кнопкою миші таблицю в Провіднику об’єктів, Оберіть верхні 1000 рядків

У ньому будуть вказані всі стовпці, а не *. Потім видаліть небажані стовпці. Має бути набагато швидше, ніж самостійно набрати текст.

Потім, коли вам здається, що це занадто багато роботи, отримайте SQL-підказку Red Gate і введіть ssf від tbl, перейдіть до * і ще раз натисніть на вкладку.


1

Що я часто використовую для цього випадку:

declare @colnames varchar(max)=''

select @colnames=@colnames+','+name from syscolumns where object_id(tablename)=id and name not in (column3,column4)

SET @colnames=RIGHT(@colnames,LEN(@colnames)-1)

@colnames виглядає як column1,column2,column5


1

Іноді одна і та ж програма повинна обробляти різні структури баз даних. Тому я не міг використовувати список стовпців у програмі, щоб уникнути помилок у selectвисловлюваннях.

*дає мені всі необов’язкові поля. Я перевіряю, чи існують поля в таблиці даних перед використанням. Це моя причина використання *в select.

Ось як я обробляю виключені поля:

Dim da As New SqlDataAdapter("select * from table", cn)
da.FillSchema(dt, SchemaType.Source)
Dim fieldlist As String = ""
For Each DC As DataColumn In DT.Columns
   If DC.ColumnName.ToLower <> excludefield Then
    fieldlist = fieldlist &  DC.Columnname & ","
   End If
  Next

Подумайте про те, щоб розробити / уточнити своє питання / проблему.
badfilms

1

Я знаю, що це питання давнє, але сподіваюся, що це все ще може бути корисним. Відповідь надихає дискусія з форумів SQL Server . Ви можете зробити це збереженою процедурою . Він також може бути модифікований, щоб додати більше одного, крім полів.

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name from sys.columns where name not in ('colName1','colName2') and object_id = (Select id from sysobjects where name = 'tblName')
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + 'tblName'
EXEC sp_executesql  @SQL

0

Чи не було б це зробити простіше:

sp_help <table_name>

-Щоб натиснути стовпець "Ім'я стовпця"> Копіювати> Вставити (створює вертикальний список) у вікно Новий запит і просто введіть коми перед значенням кожного стовпця ... коментуйте стовпці, які ви не хочете ... набагато менше введіть, ніж будь-який код, запропонований тут і досі керований.


"набагато менше набору тексту, ніж будь-який код, запропонований тут", і набагато більше клопоту, ніж перетягування вузла "Стовпці" в редактор запитів або будь-який з інших чудових способів отримання списку. Я маю на увазі, що з таблицями з безліччю стовпців 10?
підкреслюю

0

Ви можете отримати SQL Complete з devart.com, який не просто розширює * wildcard так, як це робить SQL-підказка від Red Gate (як описано у відповіді cairnz), але також забезпечує випадок вибору стовпців із прапорцями, в яких ви можете перевірити всі стовпців, які ви хочете в списку вибору, і вони будуть вставлені автоматично для вас (і якщо ви знімете цей пункт, він буде автоматично видалений зі списку вибору).


0

У SSMS є простіший спосіб з IntelliSense та Aliasing . Спробуйте це

  1. Клацніть правою кнопкою миші текстовий редактор і переконайтесь, що IntelliSense увімкнено.
  2. Введіть запит з псевдонімом [SELECT t. * FROM name t].
  3. Перейдіть до тексту t. * Та видаліть * , і SSMS автоматично перелічить стовпці згаданої таблиці f .
Потім ви можете швидко вказати лише стовпці, які потрібно використовувати без SSMS для запису вибору до іншого сценарію, а потім зробити більше операцій з копіювання / вставки. Я цим постійно користуюся.


Чи можете ви вказати свою відповідь на виключення стовпців?
Каміколо

@Kamiccolo - те, що описується DuckWork - це РУЧНА дія. Вирізання та вставлення потрібних назв стовпців. Він просто каже, що це спосіб легше дістати до імен, без багато набирання тексту. Це не допоможе вам написати запит, який говорить "виключити цей стовпець". Він просто допомагає створити потрібний список стовпців, які ви потім вставите у свій запит.
ToolmakerSteve
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.