Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Прошу помощи в составлении запросов на выборку

Здравствуйте.
Прошу помощи в составлении запросов на выборку

Для простоты формулировки задачи я придумал такой пример.

Пункт	Друг1	Друг2
---------------------
1 Вася Коля
2 Коля Вася
3 Маша Лена
4 Лена Света
5 Степан Брунгильда
6 Степан Коля
7 Коля Степан

Как можно получить выборки, где

а) есть дружба в обе стороны, как у п.п. 1,2 и 6,7 (в выборке достаточно одной записи для каждой пары)
б) есть дружба в одну сторону, как у п.3 (т.е. второй друг обязательно должен присутствовать в поле Друг1 см п.4, но с другими парами)
в) дружба с отсутствующим в списке (не встречается в поле Друг1) , как у п. 4,5

Внимание - "Все совпадения с реальными людьми случайны а события вымышлены!" :-)
Ответ: Malyav, помощь в составлении - это значит, что вы запросы уже пытались составить и у вас не получилось.

Сейчас вы просите составить запросы вместо вас.

Все запросы - самые простые, единственное, что нужно знать - это что можно джойнить таблицу с самой собой. Дальше описание задачи уже содержит условие джойна и доп. условия на выборку, осталось их только перевести на язык SQL.
Вопрос: Правила составления запроса

Вопрос чисто теоретический. Собссно: Можно гдето посмотреть (может кто сталкивался с подобным вопросом) правила составления запросов, например:
1. В SELECT если есть функция такаято, значит таких то и таких больше быть не должно
2. В SELECT в разделе HAVING должна обьязательно быть использована функция, которая присутствует в самом SELECT...
3. В INSERT можно использовать исключительно оператор VALUES()
и.т.п.

Т.е. Мне нужна сама логика с как можно полным списком правил и ограничений.

Спасибо большое.
Ответ:
Цитата(Zorak @  20.8.2014,  00:42 )
на работе дали задачу написать парсер SQL запроса и выдать различные ошибки и ворнинги если они есть.

Берёшь справку. Там есть шаблон для любого типа запроса. Проверяешь соответствие запроса шаблону. 
Как вариант - берёшь текст готового парсера (скажем, из исходников MySQL) и адаптируешь под себя.

Цитата(Zorak @  19.8.2014,  22:16 )
1. В SELECT если есть функция такаято, значит таких то и таких больше быть не должно

Цитата(Zorak @  19.8.2014,  22:16 )
2. В SELECT в разделе HAVING должна обьязательно быть использована функция, которая присутствует в самом SELECT...

Цитата(Zorak @  19.8.2014,  22:16 )
3. В INSERT можно использовать исключительно оператор VALUES()

Все три утверждения неверны.
Вопрос: Прошу помощи в составлении запроса

Возможно вопрос совсмем "для новичка", но я застрял..

Есть запрос SELECT
Он может вытаскивать из таблицы разное (зависит от случая) кол-во строк по три колонки (назовём их data1, data2 и data3)

Есть второй запрос SELECT
Он тоже вытаскивает из таблицы данные, но в качестве условия использует результаты первого запроса.

То есть:
#
SELECT
ID
FROM `table`

WHERE

Col1 = 'data1'

AND Col2 = 'data2'

AND Col3 = 'data3'
#

Всё бы работало, если бы првый зпрос всегда возвращал тоько одну строку.

Вариант IN() не подойдёт, т.к. IN выбирает произвольно. Он может взять data1 из первой возвращённой строки, одновремено с этим data2 из десятой, а data3 из пятой.
Мне нужна чёткая привязка data1, data2 и data3 к той строке, из которой они были извлечены.


PS/ Я ещё не разобрался с тем, как объединить оба select-запроса, но над этим буду думать после того как решу вышеописанную проблему.
Ответ:
Necrosss
Это плохо ?
При составлении запросов - очень. А вообще... ну, наверное, никак.
Вопрос: Требуется помощь в составлении запроса для двух таблиц

Добрый день!
Требуется помощь в составлении запроса для MS SQL.
Имеется две таблицы -Zayavki (с заявками для выезда к клиенту) и Baza (с данными о клиенте).
Таблица Zayavki состоит из поля с ID клиента . датой выезда и типов выезда (срочный или плановый) - с названием полей id_Klient , Data_Zaezda и Tip соответственно.
Таблица Baza состоит из Id клиента, его имени и адреса - id , Name_Klient, Adress соответственно.
Нужно сделать запрос, в результате которого отобразится 10 самых часто посещаемых клиентов с отображением типа выезда (срочный или плановый).

При таком запросе, я группирую заявки и вижу часто посещаемых клиентов в порядке убывания - но не вижу тип выезда и отображаются ВСЕ клиенты, а не ТОР-10. Прошу помочь знатоков!

SELECT Baza.Name_Klient, Baza.Adress, COUNT(Zayavki.id_Klient ) as Count_US
FROM Zayavki Left JOIN Baza ON Zayavki.id_Klient = Baza.id
WHERE (Zayavki.Data_Zaezda BETWEEN :datPass1 AND :datPass2)
GROUP BY Baza.Name_Klient, Baza.Adress
ORDER BY Count_US Desc, Baza.Name_Klient
Ответ: Сделал так:

with
cW as ( SELECT TOP (10) Baza.Name_Klient, Baza.Adress, COUNT(Zayavki.id_Klient ) as Count_US
FROM Zayavki Left JOIN Baza ON Zayavki.id_Klient = Baza.id
WHERE (Zayavki.Data_Zaezda BETWEEN :datPass1 AND :datPass2)
GROUP BY Baza.Name_Klient, Baza.Adress
ORDER BY Count_US Desc, Baza.Name_Klient ) -- TOP 10 клиентов

select b.Name_Klient, b.Adress, c.Cnt, c.Data_Zaezda, c.Tip from Zayavki as cD inner join Baza as b on c.id_Klient = b.id
Where (cD.ID IN (select top(10) ID from cW order by Count_US desc)) and (Data_Zaezda BETWEEN :datPass1 AND :datPass2)
ORDER BY b.Name_Klient;

Всем СПАСИБО!
Вопрос: sys_refcursor в составлении запроса

Можно ли использовать переменную sys_refcursor в составлении запроса

т.е. вместо
begin
  open v_cursor for
    select dummy, cursor(select 1 id from dual) cr from dual;
end;
/


у нас есть уже открытый курсор, который и нужно поместить в конструкцию запроса
declare
  v_c   sys_refcursor;
begin
  open v_c for select 1 id from dual;

  open v_cursor for
    select dummy, v_c  cr from dual;
end;
/
Ответ: Retvit,

Да можно и так, лиж бы ручки не болели
with questions as (select 'question 1' QUESTION from dual union all
                   select 'question 2' QUESTION from dual union all
                   select 'question 3' QUESTION from dual) 
,responder as (select 'resp1' Name from dual union all
               select 'resp2' Name from dual union all
               select 'resp13' Name from dual)
,t2 as (
            select  xmlagg(xmlelement("responder",Name)) responders
              from  responder
           )
           
select  xmlserialize(
                     document
                     xmlelement(
                                "survey",
                                 xmlagg(xmlelement("responders", xmlattributes(QUESTION as "QUESTION"), responders))
                               )
                     indent size = 2
                    ) survey
  from  questions,
        t2

<survey>
  <responders QUESTION="question 1">
    <responder>resp1</responder>
    <responder>resp2</responder>
    <responder>resp13</responder>
  </responders>
  <responders QUESTION="question 2">
    <responder>resp1</responder>
    <responder>resp2</responder>
    <responder>resp13</responder>
  </responders>
  <responders QUESTION="question 3">
    <responder>resp1</responder>
    <responder>resp2</responder>
    <responder>resp13</responder>
  </responders>
</survey>
Вопрос: SQL SERVER 2014 при составлении запроса не видит таблиц, как исправить?

SQL SERVER 2014 при составлении запроса не видит таблиц, как исправить?
Ответ: ты не в той базе сидишь (master), выбери DB_Store, станет легче
Вопрос: Составление запроса с агрегатными функциями

Добрый день! Помогите пожалуйста правильно составить запрос:

Таблица operations имеет такую структуру(для нее есть еще доп. таблица со свойствами - ее приводит не буду):
opr_id | opr_type | opr_document | opr_quantity | opr_item
1________2___________1_____________10________2
2________2___________1_____________3_________5
3________2___________2_____________4________16
4________1___________4_____________1________18


SQL
1
2
3
4
5
6
SELECT
 
 COALESCE( SUM(CASE WHEN opr_type=2 THEN oap_cost*opr_quantity ELSE 0 END), 0.0) sls_total_cost
 
FROM  operations 
  JOIN operations_additional_prop  ON  opr_id = oap_operation
Что делает данный запрос - понятно.

И есть такой запрос. Он сначала группирует по типу и документу

SQL
1
2
3
4
5
6
7
SELECT
 
 COALESCE( SUM(CASE WHEN opr_type=2 THEN (ТУТ БУДЕТ ПОДЗАПРОС НА ОСНОВАНИИ ID ДОКУМЕНТА) ELSE 0 END), 0.0) sls_total_payment
 
FROM  operations 
  JOIN operations_additional_prop  ON  opr_id = oap_operation
GROUP BY opr_type, opr_document

Так вот хотелось бы объединить два этих запроса в один. Т.е. расчитывать sls_total_cost и sls_total_payment в одном запросе. Но проблема в том, что для расчета sls_total_cost группировка не нужна, а для sls_total_payment обязательна.

Буду благодарен за помощь
Ответ: andevel, во-первых, непонятно, зачем Вам внутренний CASE если легче вынести условие opr_type=2 в WHERE.
Во-вторых, зачем во втором запросе группировать по opr_type, если CASE всё равно "выбирает" только одно значение этого столбца. В-третьих, совмещать запрос, который возвращает один результат, общий(как первый), и запрос со множеством результатов с группировкой противоестественно, как мне кажется.
Возможно только если в каждую строку группирующего (второго) запроса, вторым столбцом подзапросом вставить результат первого запроса, как-то так:
SQL
1
2
3
4
5
6
7
8
SELECT COALESCE(SUM(ТУТ БУДЕТ ПОДЗАПРОС НА ОСНОВАНИИ ID ДОКУМЕНТА), 0.0) sls_total_payment,
(SELECT COALESCE( SUM(oap_cost*opr_quantity), 0.0) FROM operations 
 JOIN operations_additional_prop  ON  opr_id = oap_operation
WHERE opr_type=2) sls_total_cost
FROM  operations 
JOIN operations_additional_prop  ON  opr_id = oap_operation
WHERE opr_type = 2
GROUP BY opr_document
Вопрос: Составление запроса на количество вхождений определенного значения

Доброго времени суток!
Если две таблицы: Отделы и Сотрудники. Есть несколько отделов, в них работают сотрудники (связь один ко многим). У сотрудников есть категория. Пытаюсь составить запрос, чтобы узнать сколько работает сотрудников в каждом отделе и количество сотрудников каждой категории в этом отделе.
т.е. примерно так:
Наименование отдела, Кол-во сотрудников в общем, Кол-во сотрудников 1-й категории, 2-й категории и т.д.

Общее количество сотрудников сделал, а вот как выбрать из этого общего количества количество определенных категорий?
Ответ: Можно перекрестным запросом
Код SQL
1
2
3
4
5
transform COUNT(*)
SELECT Подразделения.[Код отдела], Подразделения.[Наименование отдела], COUNT(*) AS Всего
FROM Подразделения LEFT JOIN Сотрудники ON Подразделения.[Код отдела]=Сотрудники.[Код отдела]
GROUP BY Подразделения.[Код отдела], Подразделения.[Наименование отдела]
pivot Сотрудники.[Категория сотрудника]
Вопрос: Трудности в составления запросов!

Имеется таблица:
ccpatNoraitingofficeapplicantOriginaloperatorAppCountpriorityCountryListOfCountriesapplPattechnologyidpatentinfo
AU20023678036IP AustraliaRabinowitz Mario# Davidson MarkUS# USUSAU#US#WOAS2.3#1
AU20023645004IP AustraliaCHEN LeonUSUS# WOAU#DE#TW#US#WOAS2.3#S2.6#2
AU20032074306IP AustraliaOCEAN POWER CORPORATIONUSUSCA#EP#JP#US#WOAS2.2#3
AU76787510IP AustraliaCiba Specialty Chemicals Holding Inc.CHUSAT#AU#BR#CA#CN#CZ#DE#EP#JP#RU#TW#US#WOPSC#4
AU75995211IP AustraliaCiba Specialty Chemicals Holding Inc.CHUSAT#AU#BR#CA#CN#CZ#DE#DK#EP#ES#JP#PT#RU#TW#US#WOPSC#5
AU200221750011IP AustraliaSphelar Power CorporationJPWOAU#CA#CN#DE#EP#HK#JP#KR#TW#US#WOAS2.3#6
AU200225530311IP AustraliaSphelar Power CorporationJP0AU#CA#CN#EP#JP#KR#TW#US#WOAS2.3#7
AU75827213IP AustraliaCanon Kabushiki KaishaJPJPAU#CN#DE#EP#JPPS2.3#8
AU20032485397IP AustraliaJANVRIN William M# SCHRIPSEMA Jason EUS# USUSAU#DE#EP#ES#US#WOAS2.3#9
BR1118465EPODRUCKER ERNEST RCAUS# WOAU#BR#CA#CN#EP#US#WOAS2.5#S3#10
BR1090017EPOENECO INCUSUS# WOAU#CA#CN#EP#KR#MX#US#WOASC#11
CA24083089CIPOSCHOTT GLASDEDEAT#CN#DE#EP#ES#JP#USASC#12
CA24069808CIPOSCHOTT GLASDEDEAT#CN#DE#EP#JP#USAS2.7#13
CA245138710CIPOTanaka KunihideUSUSAU#BR#CN#EP#JP#RU#TW#US#WOAS2.3#14
CA24198008CIPOSchott AG# SCHOTT GLASDE# DEDEAT#CN#DE#EP#ES#IL#KR#USAS2.3#15
CA24585486CIPORAYTHEON COMPANYUSUSAU#CA#CN#EP#JP#RU#US#WOAS2.3#16
CA23929209CIPOAMERICAN SIGNAL COMPANYUSUSAU#CA#MX#USASC#17
CN14463024SIPO (CN)Suntracker Dome Ltd.USZAAU#BR#CN#EP#JP#US#WO#ZAAS2.6#18
CN14610596SIPO (CN)JX Crystal Co., Ltd.USUSAU#CN#US#WOAS2.3#19
CN14418938EPOSOLAR ENTERPRISES INTERNATIONAL, L.L.CUSUSAT#AU#CN#DE#EP#ES#HK#IL#JP#PT#US#WOASC#20
CN14209926SIPO (CN)Midwest Research InstituteUSUSAU#EP#US#WOASC#21
CN14362825EPODRUCKER ERNEST RCAUSAU#BR#CA#CN#EP#US#WOAS2.5#S3#22
CN14455075SIPO (CN)Schott GlasswerkeDEDEAT#CA#CN#DE#EP#ES#IL#KR#USAS2.3#23
CN14280206SIPO (CN)Eneco, Inc.USUS# WOAU#BR#CA#CN#EP#KR#MX#US#WOASC#24
CN112279113EPOANUTECH PTY LTDAUAUAU#CN#EP#ES#IL#MX#PT#WOPSC#25
Хотелось бы получить такой результат:
OfficeSummPatentAverageRaitingNonresidentActivityTop10CountriesTehnolShare
AUA=6 P=38,7895%EP 4% AU 4% WO 4% AT 2% S2.3 60% S2.6 10% SC 20% S2.2 10%
BRA=2 P=0685%EP 6% AU 8% WO 2% AT 1% SC 33% S2.5 33% S3%
CAA=6 P=08,3375%EP 10% AU 5% WO 7% AT 9% S2.3 50% S2.7 16% SC 33%
CNA=7 P=16,6374%EP 12% AU 8% WO 7% AT 6% S2.3 22% S2.6 11% SC 44% S2.5 11% S3 11%
Смог написать только такие запросы:
SELECT DISTINCT cc FROM patentInfo;


Селекты выдают результат как надо, но добавляют в Result новые записи, что не есть хорошо.
SELECT applpat, count(*) FROM patentInfo WHERE applpat = "A" GROUP BY cc
SELECT applpat, count(*) FROM patentInfo WHERE applpat = "P" GROUP BY cc

А Апдейты записывают в строки одинаковые значения:
UPDATE Result SET SummPatent = (SELECT count(*) AS "P" FROM patentInfo GROUP BY cc);
UPDATE Result SET AverageRaiting = (SELECT ROUND((avg(raiting)), 1) FROM patentInfo GROUP BY cc);
В таблице Result должны быть (из записей таблицы patentInfo с одинаковым «сс») :
1) В первой колонке ‑ одно значение «сс» таблицы patentInfo;
2) Во второй колонке ‑ суммарное количество заявок «А»и суммарное количество патентов «Р» из колонки «applPat»таблицы patentInfo;
3) В третьей колонке ‑ средний рейтинг с точностью до одной десятой;
4) В четвёртой колонке ‑доля отличающихся кодов колонки «operatorAppCount». (общее количество это коды колонки «ListOfCountries»);
5) В пятой колонке ‑Топ 10 кодов с указанием доли из общего количества колонки «ListOfCountries»;
6) В шестой колонке ‑ Доля упоминания каждой технологии (S2.3 и т.д.) в общем массиве документов. (общее количество документов = 100% в записях с одинаковым «сс»).
Ответ:
Bit_Man
Получи хотя бы результат запросом пунктов 1-3, без update
Почему без update?
Вопрос: SQLite. Составление запроса с исключением элемента

Здравствуйте.
Во время работы с SQLite DB заметил, что запрос зачастую получается на столько длинным, что выскакивает эксепшен, и приложение аварийно закрывается. Выглядит он следующим образом:
word LIKE '%ретографоманов' AND word <> 'эретографоманов' OR word LIKE '%етографоманов' AND word <> 'эретографоманов' OR word LIKE '%тографоманов' AND word <> 'эретографоманов' OR и так далее.
Ключевым и повторяющимся отрывком, здесь является "AND word <> 'эретографоманов' после каждого меняющегося OR.
Есть ли иной способ исключить ввод одной и той же строки?
Пример кода.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        String wordLike = "word LIKE '%", wordDesLike = "word <> '" + word + "'";
        String and = "' AND ", or = " OR ";
 
        //СтрингБилдер для строковой составления строковой команды.
        StringBuilder stringBuilder = new StringBuilder();
 
        //Заполняем стринг билдер окончаниями из коллекции окончаний
        //НУЖНО ПЕРЕДЕЛАТЬ!! НЕ КРАСИВАЯ РЕАЛИЗАЦИЯ И В РЕДКИХ СЛУЧАЯХ ПОЛУЧАЕТСЯ ДЛИННЫЙ ЗАПРОС
        //КОТОРЫЙ ЗАКРЫВАЕТ ПРИЛОЖЕНИЕ С ОШИБКОЙ!
        for (int i = 0; i < endingsWord.size(); i++) {
            stringBuilder.append(wordLike).append(endingsWord.get(i)).append(and);
            stringBuilder.append(wordDesLike).append(or);
        }
 
        //Удаляем ненужные OR из стрингбилдера
        stringBuilder.delete(stringBuilder.lastIndexOf(" OR"), stringBuilder.length());
        Log.d(LOG_TAG, stringBuilder.toString());
 
        //Создали курсор, который будет читать записи в базе данных
        Cursor cursor = database.query(DBHelper.TABLE_WORDS, null, String.valueOf(stringBuilder), null, null, null, null);
Ответ: Мда... как я сам не догадался, все гениальное - просто. Спасибо.