Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
1

выборка с некоторой логикой

26.03.2013, 18:42. Показов 405. Ответов 8
Метки нет (Все метки)

Добрый день.

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

И так что у нас есть:

Оставил 4 табл. из БД чтобы было легче ориентироваться. рис. 1
tb_Specifications – характеристика предмета
tb_SpecificationAnswers – ответ для характеристик
tb_Goods –нечто (предмет).
tb_GoodsSpecificationAnsers- связь ответов с предметами

Есть также входная строка Answers. Которая состоит из некоторых ид ответов. Допусти 21 27 29

Есть запрос.
Кликните здесь для просмотра всего текста

T-SQL
1
2
3
4
5
6
7
8
9
SELECT sa.AnswerID AS 'ID', sa.Title+' ('+CAST(COUNT(gs.GoodsID) AS varchar)+')' AS 'Title',  sp.Title, sa.SpecificationID
        FROM tb_SpecificationAnswers as sa
            INNER JOIN tb_GoodsSpecificationAnswers as gsa ON sa.AnswerID=gsa.SAID
            INNER JOIN tb_Goods as gs ON gsa.GoodsID=gs.GoodsID
            INNER JOIN tb_GoodsSupplierPrice gsp ON gs.GoodsID=gsp.GoodsID
            INNER JOIN tb_Specifications as sp ON sa.SpecificationID=sp.SpecificationID
        
GROUP BY sa.AnswerID, sa.Title,sp.Title,sa.SpecificationID
ORDER BY sa.SpecificationID, sa.AnswerID

Которому будет добавлено: WHERE gs.GoodsID IN (?)

Не сложно догадаться, что мне нужно. Т.е. выбрать GoodsID. Все то ничего, но надо это сделать по некоторым правилам (логикой).

Для того чтобы объяснить эти правила приведу две таблицы (просто чтобы объяснить).

1.Код ниже (не важен), а вид рис. 2.
Кликните здесь для просмотра всего текста

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    t1.SpecificationID,
    STUFF(
            (
            SELECT ',' + CONVERT(NVARCHAR(256),AnswerID)
            FROM tb_SpecificationAnswers t2
            WHERE
                t1.SpecificationID = t2.SpecificationID AND t2.AnswerID > ''
                ORDER BY t2.AnswerID ASC
            FOR XML PATH('') 
            )
    ,1,1,'') AS Answer, @Specifications
FROM tb_SpecificationAnswers t1 
GROUP BY
    t1.SpecificationID
ORDER BY t1.SpecificationID ASC

Мы здесь видим Ид наших характеристик и ответы для них (сделал в одну строку чтобы визуально показать). А также 3 столбец входная строка Answers.

2.Код ниже (не важен), а вид рис. 3.
Кликните здесь для просмотра всего текста

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
    t1.GoodsID,
    STUFF(
            (
            SELECT ',' + CONVERT(NVARCHAR(256),SAID)
            FROM tb_GoodsSpecificationAnswers t2
            WHERE
                t1.GoodsID = t2.GoodsID AND t2.SAID > ''
                ORDER BY t2.SAID ASC
            FOR XML PATH('') 
            )
    ,1,1,'') AS SAID, @Specifications
FROM tb_GoodsSpecificationAnswers t1 
GROUP BY
    t1.GoodsID
ORDER BY t1.GoodsID ASC

Мы здесь видим Ид наших предметов и ответы для них (сделал в одну строку чтобы визуально показать). А также 3 столбец входная строка Answers.

И так что мне надо:
Мне надо выбрать GoodsID.
Объяснение.
У нас строка Answers=21 27 29 смотря на рис. 2 я раскладываю ее за таким правилом 21 27, 21 29 , т.е. если SpecificationID одинаковый то между ними логика OR (или), а между разными SpecificationID AND (и). А с рис. 3. мне надо просто выбрать те GoodsID в которых есть 21 27 или 21 29 т.е. получится такие (черт) получится все ид. Логика надеюсь понятна.
Помогите плз.
0
Миниатюры
выборка с некоторой логикой   выборка с некоторой логикой   выборка с некоторой логикой  

выборка с некоторой логикой  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2013, 18:42
Ответы с готовыми решениями:

Выборка из таблицы с логикой или
Доброго времени суток. У меня такая проблема, с MySQL работаю недавно, есть таблица с товарами - 3...

Что-то с логикой
Помогите разобраться, не могу догнать что-то... Лист: private void button_Click(object...

Проверка логикой
Помогите пожалуйста проверить, есть ли в сгенерированной таблице (stringrid1) строки в которых нет...

Косяк с логикой
Всем привет. Создал простенькую страничку со скриптом, но видимо где-то с логикой накосячил - не...

__________________
8
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
26.03.2013, 18:54  [ТС] 2
pic4 к первому запросу !
0
1311 / 943 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
26.03.2013, 19:48 3
для (21,23,29) надо выбрать только те строки, где есть все три значения? то есть № 4, 5 и 7 ?
То есть:
spec_idanswer@reqselected
220,2121,23,29(2)21
315,16,17,30,3121,23,29-
422,23,24,25,2621,23,29(4)23
527,28,2921,23,29(5)29
а в первоначальном варианте связки за счет
spec_idanswer@reqselected
220,2121,27,29(2)21
315,16,17,30,3121,27,29-
422,23,24,25,2621,27,29-
527,28,2921,27,29(5)27,29
дают(2)21-(5)27 или (2)21-(5)29
Правильно?
1
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
26.03.2013, 20:00  [ТС] 4
Цитата Сообщение от cygapb-007 Посмотреть сообщение
для (21,23,29) надо выбрать только те строки, где есть все три значения? то есть № 4, 5 и 7 ?
То есть:
spec_id answer @req selected
2 20,21 21,23,29 (2)21
3 15,16,17,30,31 21,23,29 -
4 22,23,24,25,26 21,23,29 (4)23
5 27,28,29 21,23,29 (5)29
два раза да

Добавлено через 1 минуту
правильно
0
1311 / 943 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.03.2013, 00:34 5
дальше начала пока не продвинулся, потом подумаю...
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
declare @Specifications varchar(max)='21,27,29'
-- set @Specifications='21,23,29'
-- if object_id('tempdb..#tb_SpecificationAnswers') is not null drop table #tb_SpecificationAnswers
if object_id('tempdb..#tb_SpecificationAnswers') is null begin
    create table #tb_SpecificationAnswers (SpecificationID int,AnswerID int)
    insert #tb_SpecificationAnswers values 
       (2,20),(2,21),(3,15),(3,16),(3,17),(3,30),(3,31),(4,22),
      (4,23),(4,24),(4,25),(4,26),(5,27),(5,28),(5,29)
end
-- if object_id('tempdb..#tb_GoodsSpecificationAnswers') is not null drop table #tb_GoodsSpecificationAnswers
if object_id('tempdb..#tb_GoodsSpecificationAnswers') is null begin
    create table #tb_GoodsSpecificationAnswers (GoodsID int, SAID int)
    insert #tb_GoodsSpecificationAnswers values 
       (1,21),(1,22),(1,26),(1,29),(1,31),(2,17),(2,21),(2,22),(2,25),(2,26),(2,29),
       (4,18),(4,21),(4,23),(4,26),(4,29),(5,21),(5,22),(5,23),(5,26),(5,29),(5,30)
end
 
select * from #tb_SpecificationAnswers where ','+@Specifications+',' like '%,'+convert(varchar,AnswerID)+',%' 
select * from #tb_GoodsSpecificationAnswers
Добавлено через 3 часа 0 минут
вроде работает...
T-SQL
1
2
3
4
5
6
7
8
9
select g.GoodsID
from #tb_GoodsSpecificationAnswers g
join(
   select *,dense_rank()over(order by SpecificationID)qty
   from #tb_SpecificationAnswers 
   where ','+@Specifications+',' like '%,'+convert(varchar,AnswerID)+',%' 
   )s on  s.AnswerID=g.SAID
group by g.GoodsID 
having count(distinct s.SpecificationID)=max(s.qty)
1
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
27.03.2013, 13:49  [ТС] 6
cygapb-007 еще раз огромное спасибо, работает.

Не по теме:

Еще раз убеждаюсь, что мои познаний в Sql приближаются к нулю.
Реально убил бы неделю и вряд ли придумал, потом бы плюнул и составил (сложил) бы запрос на стороне клиента. Или на крайний случай оставил все как есть.



Добавлено через 1 час 9 минут
Цитата Сообщение от cygapb-007 Посмотреть сообщение
вроде работает...
поторопился 21,26,29 и 21,23,29 не совсем работает.
0
1311 / 943 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.03.2013, 13:57 7
Цитата Сообщение от skynick99 Посмотреть сообщение
поторопился 21,26,29 и 21,23,29 не совсем работает.
Пример тестовых данных можно? На которых неверно работает
1
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
27.03.2013, 14:09  [ТС] 8
Кликните здесь для просмотра всего текста

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
declare @Specifications varchar(max)='21,26,29'
set @Specifications='21,23,29'
-- if object_id('tempdb..#tb_SpecificationAnswers') is not null drop table #tb_SpecificationAnswers
if object_id('tempdb..#tb_SpecificationAnswers') is null begin
    create table #tb_SpecificationAnswers (SpecificationID int,AnswerID int)
    insert #tb_SpecificationAnswers values 
       (2,20),(2,21),(3,15),(3,16),(3,17),(3,18),(3,19),(3,30),(3,31),(3,32),(4,22),
      (4,23),(4,24),(4,25),(4,26),(5,27),(5,28),(5,29)
end
-- if object_id('tempdb..#tb_GoodsSpecificationAnswers') is not null drop table #tb_GoodsSpecificationAnswers
if object_id('tempdb..#tb_GoodsSpecificationAnswers') is null begin
    create table #tb_GoodsSpecificationAnswers (GoodsID int, SAID int)
    insert #tb_GoodsSpecificationAnswers values 
       (1,21),(1,22),(1,26),(1,29),(1,31),(2,17),(2,21),(2,22),(2,25),(2,26),(2,29),
       (4,18),(4,21),(4,23),(4,26),(4,29),(5,21),(5,22),(5,23),(5,26),(5,29),(5,30),(6,19),(6,21),(6,23),(6,26),(6,27),
       (7,21),(7,22),(7,23),(7,24),(7,25),(7,26),(7,29),(7,32)
end

лишний с ид 6
0
1311 / 943 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
27.03.2013, 14:35 9
да, точно... вот поправка:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
select g.GoodsID
from #tb_GoodsSpecificationAnswers g
join(
   select SpecificationID,AnswerID,MAX(qty)over()qty 
   from (
      select *,dense_rank()over(order by SpecificationID)qty
      from #tb_SpecificationAnswers 
      where ','+@Specifications+',' like '%,'+convert(varchar,AnswerID)+',%' 
      )s
   )s on  s.AnswerID=g.SAID
group by g.GoodsID, s.qty
having count(distinct s.SpecificationID)=s.qty
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.03.2013, 14:35

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Компьютер с логикой
Кто-нибудь слышал, про такой проект? Компьютер с голосовыми качествами, у него система...

Проблемы с логикой
string src = "There are many big and small libraries everywhere in our country"; if...

Запутался с логикой составления БД
Добрый день! Запутался с логикой составления БД. Главная таблица содержит корабли. Корабль может...

Программа с 4-х значной логикой
Работа представляет собой несколько дополнительных функций и одну основную (menu), средствами...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.