powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Best practice по сведению двух CTE
25 сообщений из 98, страница 3 из 4
Best practice по сведению двух CTE
    #39563962
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,
Во первых, спасибо за конструктивное предложение и за желание помочь.
Нет, тут никто не злой и все правы:) Только нервные немного. Ну да, никто не железный, и я тоже:)
Тяжело отвечать каждый раз новому гуру на те же упрёки :) Только одному всё объяснишь, следующий появляется.
Но это хорошо - мощный траффик гуру детектед.

Во вторых, вы дали исчерпывающий ответ на вопрос заданый там.
Здесь вашего скрипта недостаточно по причине которую я уже много раз тут озвучил.

3. Прекрасно понимаю что хочу. Думал достаточно.

4. Код готов ещё вчера и выдаёт именно тот результат что требовался.

5. В рамках проявления доброй воли и попытки выяснить для себя насчёт DISTINCT в OUTER APPLY чуть позже постараюсь запостить пример Input/Output + скриптик.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563964
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileНу ты же можешь упростить до вменяемого уровня!

Нафига нам проникать мозгом твои сложные структуры, когла концептуально вопрос о том, как юзать ссылки цте на цте и аплаи?

Прав совершенно. Учту на будущее.
Понял что на этом не стоит экономить время.
Спасибо.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563971
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnet4. Код готов ещё вчера и выдаёт именно тот результат что требовался.
Мы так и поняли, что ты хочешь узнать, а можно ли сделать лучше (быстрее/удобнее/нагляднее). Но твой вопрос в первом посте был слишком абстрактным, чтобы ответить на него адекватно. Потому и начали слегка подначивать. Ты-таки раздуплился на кое-какой код, но без данных - никто не будет пытаться его улучшить, так как он и так работает.

А твой вопрос о том, что нужен нарастающий итог по заказу, а не по деталям заказа - вообще не имеет смысла с моей точки зрения. Потому и попросил исходные данные и результат, чтобы понять, что именно ты хотел этим сказать.
Так что ждем портянку
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563983
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По предложению уважаемых комрадов формулирую вопрос правильно:
Input:

OrdNo Date PartName OrdQtyЗаказ1 01/02/18 Part1 5Заказ2 01/01/18 Part1 8Заказ3 01/05/18 Part1 3Заказ4 01/01/17 Part2 10Заказ5 01/01/19 Part2 6

OrdNo WorkOrderЗаказ1 WO1Заказ1 WO2Заказ2 WO3Заказ2 WO4Заказ3 WO5


PartName BalancePart1 20Part2 29

Надо выдать все заказы (OrdNo), Date, PartName, OrdQty, Balance с распределением остатков по заказам с сортировкой по дате + ЗаказНаПроизводство (WorkOrder) привязанный к заказу.
Соответсвенно заказы 4 и 5 выпадают, а заказы 1 и 2 выдают по две записи (поскольку на каждый есть по 2 WorkOrder)
Однако распределением остатков надо произвести на уровне заказа, без разбивки по WorkOrder.

Требуемый результат выборки:
OrdNo Date PartName OrdQty AllocatedOrdQty AllocatedBalance TotalBalance WorkOrderЗаказ2 01/01/18 Part1 8 8 20 20 WO3Заказ2 01/01/18 Part1 8 8 20 20 WO3Заказ1 01/02/18 Part1 5 13 12 20 WO1Заказ1 01/02/18 Part1 5 13 12 20 WO2Заказ3 01/05/18 Part1 3 16 7 20 WO5

Скрипт в следующем посте.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563987
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович,
Раздуплился как только попросили. Уже даю. Пару минут, надо выкинуть лишнее.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39563991
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почему не так то?!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE 
  @Orders TABLE (
  OrdNo varchar(20) 
, Date datetime
, PartName varchar(20) 
, OrdQty int) 

INSERT INTO @Orders VALUES 

('Заказ1',	'01/02/18',	'Part1',	5)
,('Заказ2',	'01/01/18',	'Part1',	8)
,('Заказ3',	'01/05/18',	'Part1',	3)
,('Заказ4',	'01/01/17',	'Part2',	10)
,('Заказ5',	'01/01/19',	'Part2',	6)
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564001
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[src][/SRC]
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564002
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Либо я к концу дня деревянный, либо у тебя "желаемый результат" неправильно сделан, но насколько я понял текстовую постановку задачи, там вообще нет никаких СТЕ и аплаев.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
DECLARE 
  @Orders TABLE (
  OrdNo varchar(20) 
, Date datetime
, PartName varchar(20) 
, OrdQty int) 

INSERT INTO @Orders VALUES 

('Заказ1',	'01/02/18',	'Part1',	5)
,('Заказ2',	'01/01/18',	'Part1',	8)
,('Заказ3',	'01/05/18',	'Part1',	3)
,('Заказ4',	'01/01/17',	'Part2',	10)
,('Заказ5',	'01/01/19',	'Part2',	6)

DECLARE @Balance TABLE (PartName varchar(20), Balance int ) 
INSERT INTO @Balance  VALUES 
('Part1',	20)
,('Part2', 29)

DECLARE @Work TABLE (OrdNo varchar(20), WorkOrder varchar(20) )
INSERT INTO @Work VALUES 

('Заказ1',	'WO1')
,('Заказ1',	'WO2')
,('Заказ2',	'WO3')
,('Заказ2',	'WO4')
,('Заказ3',	'WO5')



SELECT 
  O.OrdNo  
, O.Date  
, O.PartName 
, O.OrdQty  
, B.Balance
, PartsReserved =  SUM(O.OrdQty) OVER (PARTITION BY O.PartName ORDER BY O.Date ROWS   unbounded preceding )
, PartsRest = B.Balance - (SUM(O.OrdQty) OVER (PARTITION BY O.PartName ORDER BY O.Date ROWS   unbounded preceding ))
, W.WorkOrder
 FROM @Orders O 
INNER JOIN  @Balance B ON B.PartName = O.PartName
INNER JOIN @Work W ON W.OrdNo = O.OrdNo
 ORDER BY O.Date, O.OrdNo, W.WorkOrder 

 
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564003
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отдельно непонятно зачем тут вообще сортировка по WorkOrder когда за ним ничего не стоит.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564006
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обещаный код.
Надеюсь что не накосячил, пришлось сильно упрощать структуру и названия таблиц/полей.
Не факт что исполнится как есть:)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
WITH 
Orders
as
(
SELECT ORDERS.Ordname Ordname, PART.PartName PartName, ORDERS.OrdQuant OrdQuant, 
SERIAL.WorkOrder WorkOrder, ORDERS.Date Date
FROM ORDERS JOIN PART
ON ORDERS.PART = PART.PART
JOIN SERIAL  
ON (ORDERS.SERIAL = SERIAL.SERIAL AND ORDERS.PART = SERIAL.PART)
WHERE ORDERS.CLOSED <> 'C'
)
,
PartBalance
as
(
SELECT PART.PartName PartName, WARHSBAL.BALANCE Balance
FROM WARHSBAL JOIN PART
ON WARHSBAL.PART = PART.PART
WHERE WARHSBAL.BALANCE > 0
)
,
OrdsDistinctTmp as 
(
SELECT distinct Ordname, PartName, OrdQuant, Date FROM Orders
)
,
OrdsDistinct as 
(
SELECT distinct Ordname, PartName, OrdQuant, Date, 
(ROW_NUMBER() OVER (PARTITION BY PartName ORDER BY Date)) as rn
FROM OrdsDistinctTmp
)
SELECT 
	OrdsDistinct1.PartName, OrdsDistinct1.Date, OrdsDistinct1.Ordname, OrdsDistinct1.OrdQuant, AllocatedOrdQty,
	ISNULL(Balance, 0) as TotalBalance, (ISNULL(Balance, 0)-AllocatedOrdQty) as AllocatedBalance, Orders.WorkOrder
FROM
  OrdsDistinct OrdsDistinct1
  Full Outer Join Orders
	ON OrdsDistinct1.Ordname = Orders.Ordname
  Left Join PartBalance
  ON PartBalance.PartName = OrdsDistinct1.PartName
	OUTER APPLY (
     SELECT
       SUM(OrdQuant) as AllocatedOrdQty
     FROM
        OrdsDistinct OrdsDistinct2
     WHERE
       OrdsDistinct2.PartName = OrdsDistinct1.PartName
       AND OrdsDistinct2.rn <= OrdsDistinct1.rn         
       ) as alloc
       Order By OrdsDistinct1.PartName, OrdsDistinct1.Date   
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564007
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileОтдельно непонятно зачем тут вообще сортировка по WorkOrder когда за ним ничего не стоит.

Вроде про сортировку по WorkOrder нигде в условиях не упоминалось.
Но сам WorkOrder юзер хочет видеть.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564008
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileНу почему не так то?!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE 
  @Orders TABLE (
  OrdNo varchar(20) 
, Date datetime
, PartName varchar(20) 
, OrdQty int) 

INSERT INTO @Orders VALUES 

('Заказ1',	'01/02/18',	'Part1',	5)
,('Заказ2',	'01/01/18',	'Part1',	8)
,('Заказ3',	'01/05/18',	'Part1',	3)
,('Заказ4',	'01/01/17',	'Part2',	10)
,('Заказ5',	'01/01/19',	'Part2',	6)



Понял, ну, в следующий раз. Хотел как красивше.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564017
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

Вот именно если сделать так то на каждую запись по Ordname где 2 WorkOrder'a будет удвоен нарастающий итог.
Должно быть так:
OrdNo Date PartName OrdQty AllocatedOrdQty AllocatedBalance TotalBalance WorkOrderЗаказ2 01/01/18 Part1 8 8 20 20 WO3Заказ2 01/01/18 Part1 8 8 20 20 WO3Заказ1 01/02/18 Part1 5 13 12 20 WO1Заказ1 01/02/18 Part1 5 13 12 20 WO2Заказ3 01/05/18 Part1 3 16 7 20 WO5
А будет так:
OrdNo Date PartName OrdQty AllocatedOrdQty AllocatedBalance TotalBalance WorkOrderЗаказ2 01/01/18 Part1 8 8 20 20 WO3Заказ2 01/01/18 Part1 8 16 12 20 WO3Заказ1 01/02/18 Part1 5 21 4 20 WO1Заказ1 01/02/18 Part1 5 26 -1 20 WO2Заказ3 01/05/18 Part1 3 29 -6 20 WO5

С подбивкой баланса в это время суток мог ошибиться, но смысл ясен.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564029
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну убери тогда джойн на воркинг ордерс. Вместо него напиши вере ордернум ин...

Рассчитай набегающий итог без ордеров, а потом уже помнож на них.

Все ещё без цте и аплаев.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564087
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

А, у меня 2008.
unbounded preceding не сработает.
Забыл что пробовал уже.

"Рассчитай набегающий итог без ордеров, а потом уже помнож" это ж выходим обратно на CTE, или лыжи не едут?
Ну типа свести там все выборки.

Да и для APPLY надо в CTE подготовить ROW_NUMBER?
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564088
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
DECLARE 
  @Orders TABLE (
  OrdNo varchar(20) 
, Date datetime
, PartName varchar(20) 
, OrdQty int) 

INSERT INTO @Orders VALUES 

('Заказ1',	'01/02/18',	'Part1',	5)
,('Заказ2',	'01/01/18',	'Part1',	8)
,('Заказ3',	'01/05/18',	'Part1',	3)
,('Заказ4',	'01/01/17',	'Part2',	10)
,('Заказ5',	'01/01/19',	'Part2',	6)

DECLARE @Balance TABLE (PartName varchar(20), Balance int ) 
INSERT INTO @Balance  VALUES 
('Part1',	20)
,('Part2', 29)

DECLARE @Work TABLE (OrdNo varchar(20), WorkOrder varchar(20) )
INSERT INTO @Work VALUES 

('Заказ1',	'WO1')
,('Заказ1',	'WO2')
,('Заказ2',	'WO3')
,('Заказ2',	'WO4')
,('Заказ3',	'WO5')



SELECT 
  Z.* 
, W.WorkOrder

FROM(
  SELECT 
    O.OrdNo  
  , O.Date  
  , O.PartName 
  , O.OrdQty  
  , B.Balance
  , PartsReserved =  SUM(O.OrdQty) OVER (PARTITION BY O.PartName ORDER BY O.Date ROWS   unbounded preceding )
  , PartsRest = B.Balance - (SUM(O.OrdQty) OVER (PARTITION BY O.PartName ORDER BY O.Date ROWS   unbounded preceding ))
 
   FROM @Orders O 
     INNER JOIN  @Balance B ON B.PartName = O.PartName
   WHERE EXISTS (SELECT 1 FROM @Work W WHERE W.OrdNo = o.OrdNo) 
 ) Z
 INNER JOIN @Work W ON W.OrdNo = Z.OrdNo
 ORDER BY Z.Date, Z.OrdNo , W.WorkOrder

 
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564089
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, спасибо.
Правда засаду с unbounded preceding всё равно надо как-то обойти.
А такой код отработает быстрее чем CTE? У меня с CTE очень тормозит.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564090
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, и правда, так увлёкся CTE что протормозил насчёт обычного вложенного селекта.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564093
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetО, спасибо.
Правда засаду с unbounded preceding всё равно надо как-то обойти.
А такой код отработает быстрее чем CTE? У меня с CTE очень тормозит.
Что вы к этому CTE придрались... Это просто более удобная форма записи запроса.

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT * FROM (SELECT * FROM (SELECT * FROM TableA) as rez) as rez2
--тоже самое что
;WITH Rez AS
  (SELECT * FROM TableA),
Rez2 AS
  (SELECT * FROM Rez)
SELECT * FROM Rez2


SQL сервер разворачивает ваше CTE в одно большое выражение...
И если вам кажется что
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
;WITH CTE AS
  (SELECT * FROM TableA),
CTE2 AS
  (SELECT * FROM CTE WHERE ID < 5).
CTE3 AS
  (SELECT * FROM CTE WHERE ID > 10)
SELECT * FROM CTE2 AS c2
JOIN CTE3 AS c3
  ON c3.ID = c2.ID


Сервер 1 раз выполнит SELECT * FROM TableA то вы заблуждаетесь....
Потому что он развернет это в
Код: sql
1.
2.
3.
SELECT * FROM (SELECT * FROM (SELECT * FROM TableA) WHERE ID < 5) AS c2
JOIN (SELECT * FROM (SELECT * FROM TableA) WHERE ID > 10) AS c3
  ON c3.ID = c2.ID


Как видите читаем TableA 2 раза...


P.S. Код с оконными функциями отработает быстрее чем вложенные корреляционные запросы, которым кстати тоже нарастающие итоги считаются...
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564094
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://blogs.technet.microsoft.com/isv_team/2011/07/26/1080/

Вот вам 4 примера расчета нарастающих итогов... Выбирайте какой хотите..
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564098
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,

Спасибо.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564160
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite https://blogs.technet.microsoft.com/isv_team/2011/07/26/1080/
Вот вам 4 примера расчета нарастающих итогов... Выбирайте какой хотите..
Лучший из 4х примеров автор не может, у него лапки 2008й. 2 других - корявое тормозное бе.
Так, что выбор только один - сэлф джойн.


Кстати, это очень показательный топик. В очередной раз человек вместо того, чтоб задать вопрос по сути задачи, задает вопрос по сути того, что он принял за её решение.

Ведь "Как использовать ОТВ в ОТВ" и "Как посчитать набегающий итог без окон" - принципиально разные задачи.

Пожалуй, добавлю этот топик в закладку, как эталонный.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564238
slovnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile,

Вообще-то всё ровно наоборот.
Изначальный была описана суть задачи и задан вопрос каков best practice.

Здесь (кроме десятков неконструктивных наездов) советовали варианты с CTE.
И я так до сих пор и не понял в чём преимущество предложенного Вами решения перед CTE.
А учитывая 2008 APPLY вроде как оптимальное решение.

Вообще, это очень показательный топик, хорошо демонстрирует непонятки между новичком и экспертом.
Новичок как-бы движется в темноте, наощупь. Не знает, что именно ему надо, как правильно спросить, где искать.
Незнание возможностей синтаксиса здесь - самая маленькая проблема.

Поэтому задаёт вопрос общий - как лучше сделать. Каков консепт?
А ему в ответ - чего синтаксис не гуглил??!!! Начинается длинная разборка насчёт синтаксиса. А через три простыни выясняется что решение совсем не там. Тогда наезд - а зачем про этот синтаксис спрашивал???!!!

В любом случае, мне лично из этой переписки один сплошной профит, получил хороший мастер-класс по T-SQL.
За что всем пинавшим-помогавшим огромное спасибо.
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564262
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slovnetВообще, это очень показательный топик, хорошо демонстрирует непонятки между новичком и экспертом.
...
Поэтому задаёт вопрос общий - как лучше сделать. Каков консепт?
Именно, грамотный новичок и задает вопрос - как лучше сделать.

А у вас получилось: "Я тут два гвоздодера нашел, как мне их соединить? Может сваркой? Или еще как?" И только через пару страниц выясняется, что надо шуруп закрутить, и лучше всего воспользоваться шуруповертом (или, учитывая ограниченность ваших инструментов из-за версии сервера - отверткой).
...
Рейтинг: 0 / 0
Best practice по сведению двух CTE
    #39564268
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит чем лучше мой вариант чем ЦТЕ.

Вопрос в том, для решения какой задачи лучше?

Для набегающего итога?
Окно >> Сэлфджоин >> ОТВ >> Курсор
Поскольку твой 2008 не может решить задачу окном, то тебе нужен самоджойн.
Почему лучше, потому, что быстрее. Просто быстрее во всех случаях.

Для инкапсуляции "промежуточных наборов данных"?
Это опять же бабушка на двое сказала. Лично я не люблю СТЕ из-за ограничений, которые они накладывают на написание кода. СТЕ ты обязан использовать СРАЗУ после объявления, и никак иначе. Понятно почему, потому, что это (кроме случая с рекурсией) простой синтаксический сахар, который развернется, в итоге в тоже что и
Код: sql
1.
SELECT  FROM (SELECT FROM) Z

.

Работу СТЕ ты не можешь, например, легко проверить во время написания процедуры, в отличие от #таблицы.

Ласт, бат нот лист, весь синтаксис ОТВ довольно необычен для скуль кода, и прямо скажем, режет глаз, особенно когда один за другим идет ворох ОТВшек- сложно распутывать.

Таким образом именно для меня ОТВ вообще ничем не лучше других способов вращать данные, при этом наличиствуют очевидные недостатки.


В моей картине мира есть ровно ДВА случая, когда нужно использовать именно ОТВ.

а) рекурсивные запросы
б) ты пишешь инлайн функцию, в которой у тебя физически нет возможности использовать временные таблицы для каких то предрасчетов.
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 3 из 4
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Best practice по сведению двух CTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]