Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
Добрый день. Помогите, пожалуйста, сформировать запрос.

Есть запрос:
with cte as (select Id, ListId, WebId,ItemId,InternalState
from Workflow) select DISTINCT cte.Id,listid,cte.ItemId
from AllUserData aw inner join cte on tp_listId=cte.ListId

Выводит полный список данных, мне нужно вывести список где ItemId таблицы Workflow не содержится в tp_ID таблицы AllUserData?
24 янв 17, 14:25    [20140033]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
londinium
Member

Откуда: Киев
Сообщений: 1198
with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select DISTINCT cte.Id,listid,cte.ItemId
from AllUserData aw inner join cte on tp_listId=cte.ListId

автор
мне нужно вывести список где ItemId таблицы Workflow не содержится в tp_ID таблицы AllUserData?

with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select DISTINCT cte.Id,listid,cte.ItemId
from AllUserData aw inner join cte on tp_listId=cte.ListId
WHERE NOT EXISTS(SELECT 1 FROM AllUserData A
                             WHERE CTE.ItemId=A.tp_ID)

что-то в таком духе
24 янв 17, 14:40    [20140130]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
При таком запросе, количество элементов сокращается на три:

with cte as (select Id, ListId, WebId,ItemId,InternalState
from Workflow) select DISTINCT cte.Id,listid,cte.ItemId
from AllUserData aw inner join cte on tp_listId=cte.ListId
and tp_id =cte.ItemId

Как получить эти три элемента? and tp_id <>cte.ItemId не подходит
24 янв 17, 14:45    [20140167]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
londinium
with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select DISTINCT cte.Id,listid,cte.ItemId
from AllUserData aw inner join cte on tp_listId=cte.ListId
WHERE NOT EXISTS(SELECT 1 FROM AllUserData A
                             WHERE CTE.ItemId=A.tp_ID)

что-то в таком духе


Нет данных при таком варианте.
24 янв 17, 14:49    [20140189]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
delpavel,

CTE там зачем?
24 янв 17, 17:59    [20141285]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
delpavel
londinium
with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select DISTINCT cte.Id,listid,cte.ItemId
from AllUserData aw inner join cte on tp_listId=cte.ListId
WHERE NOT EXISTS(SELECT 1 FROM AllUserData A
                             WHERE CTE.ItemId=A.tp_ID)

что-то в таком духе

Нет данных при таком варианте.


Так может их и нет? ;)

Откройте для себя left outer join, штоле
+

select DISTINCT
 cte.Id,cte.listid,cte.ItemId
from Workflow as cte
inner join AllUserData as aw on aw.tp_listId=cte.ListId
left join AllUserData as aw1 on aw1.tp_ID=cte.ItemId
where aw1.tp_ID is null

24 янв 17, 19:31    [20141654]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
Шыфл
delpavel
пропущено...

Нет данных при таком варианте.


Так может их и нет? ;)

Откройте для себя left outer join, штоле
+

select DISTINCT
 cte.Id,cte.listid,cte.ItemId
from Workflow as cte
inner join AllUserData as aw on aw.tp_listId=cte.ListId
left join AllUserData as aw1 on aw1.tp_ID=cte.ItemId
where aw1.tp_ID is null



В то и то и вопрос, что в tp_ID нет данных, которые есть в cte.ItemID (поэтому не может быть значения null). Нужно как то сравнить tp_ID и cte.ItemID и вывести только те данные из таблицы Workflow, которых нет в таблице AllUserData в поле tp_ID .
25 янв 17, 08:00    [20142636]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
Владислав Колосов
delpavel,

CTE там зачем?


в cte хранится весь список данных, из него нужно получить только те данные, которых нет в списке alllUserData по полю tp_ID.
25 янв 17, 08:03    [20142638]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
delpavel
в cte хранится весь список данных, из него нужно получить только те данные, которых нет в списке alllUserData по полю tp_ID.

with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select DISTINCT Id,listid,ItemId
from cte 
WHERE NOT EXISTS(SELECT 1 FROM AllUserData A
                             WHERE cte.ItemId=A.tp_ID)
25 янв 17, 08:46    [20142740]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
delpavel
В то и то и вопрос, что в tp_ID нет данных, которые есть в cte.ItemID (поэтому не может быть значения null).
Так NULL и будет в том случае, если в tp_ID нет данных
Вы не знаете, как работает LEFT JOIN?
Что то вы не так переписываете из ответов, или данные у вас не такие, как вы думаете.
Или с формулировкой вопроса что то не так :-)
25 янв 17, 08:49    [20142751]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
alexeyvg
delpavel
В то и то и вопрос, что в tp_ID нет данных, которые есть в cte.ItemID (поэтому не может быть значения null).
Так NULL и будет в том случае, если в tp_ID нет данных
Вы не знаете, как работает LEFT JOIN?
Что то вы не так переписываете из ответов, или данные у вас не такие, как вы думаете.
Или с формулировкой вопроса что то не так :-)


Поясню подробно. Таблица WorkFlow - это рабочие процессы, которые запускаются элементом ItemID. Тот же ItemID хранится в поле tp_ID таблицы ALLUserData. Если пользователь удалит элемент, то этот элемент удалится только из ALLUserData. Мне нужно найти рабочие процессы в которых пользователь удалил этот элемент.
25 янв 17, 08:56    [20142775]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
При этом все данные есть. Я проверял в excel.

Запрос выдает все рабочие процессы (3490)
with cte as (select Id, ListId, WebId,ItemId,InternalState 
from Workflow) select DISTINCT cte.Id,listid,cte.ItemId 
from AllUserData aw  inner join cte on aw.tp_listId=cte.ListId


Следующий запрос выдает на три элемента меньше(3487)

with cte as (select Id, ListId, WebId,ItemId,InternalState 
from Workflow) select DISTINCT cte.Id,listid,cte.ItemId 
from AllUserData aw  inner join cte on aw.tp_listId=cte.ListId 
and aw.tp_id=cte.ItemId


В excel я вставлял данные и находил эти три элемента, которые и нужно получить в запросе.
25 янв 17, 09:01    [20142791]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
delpavel
Member

Откуда:
Сообщений: 12
Все спасибо за участие, получен нужный запрос:

with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select  Id,listid,ItemId
from cte
left join AllUserData as aw1 on aw1.tp_listId=cte.ListId and aw1.tp_ID=cte.ItemId
where aw1.tp_ID is null
25 янв 17, 09:18    [20142861]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4453
delpavel
Все спасибо за участие, получен нужный запрос:

with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select  Id,listid,ItemId
from cte
left join AllUserData as aw1 on aw1.tp_listId=cte.ListId and aw1.tp_ID=cte.ItemId
where aw1.tp_ID is null

И чем это лучше чем
select  wfl.Id,wfl.ListId,wfl.ItemId
from Workflow as wfl
left join AllUserData as aw1 on aw1.tp_listId=wfl.ListId and aw1.tp_ID=wfl.ItemId
where aw1.tp_ID is null

?
25 янв 17, 09:42    [20142922]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
delpavel
Все спасибо за участие, получен нужный запрос:

with cte as 
(select Id, ListId, WebId,ItemId,InternalState
from Workflow) 
select  Id,listid,ItemId
from cte
left join AllUserData as aw1 on aw1.tp_listId=cte.ListId and aw1.tp_ID=cte.ItemId
where aw1.tp_ID is null
Запрос такой же, как и предыдущие несколько вариантов :-)
Что то вы не так проверяли...
25 янв 17, 12:14    [20143783]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8725
delpavel
Владислав Колосов
delpavel,

CTE там зачем?


в cte хранится весь список данных, из него нужно получить только те данные, которых нет в списке alllUserData по полю tp_ID.


У Вас неверные представления о СТЕ, там ничего не хранится. Это просто другой вид записи, в данном случае избыточный. Достаточно простого запроса с join, как показано выше.
25 янв 17, 14:03    [20144459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить