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

Уважаемые коллеги вопрос в следующем:
Есть два работающих кода:
1)
SQL
1
2
3
4
5
6
SELECT MainID.description, MainStorage.Artikul,Companys.Description
FROM MainID
  INNER JOIN (MainStorage INNER JOIN Companys ON Companys.ID_Company LIKE MainStorage.id_company)
  ON MainStorage.Artikul LIKE 'XX0080X2609' AND MainID.id_record LIKE MainStorage.id_record
  
GO
2)
SQL
1
SELECT (SELECT SUM(quantity) FROM Income WHERE id_record_storage LIKE '4255216B2' AND state=-1)-(SELECT SUM(quantity) FROM Sold WHERE id_record_storage LIKE '4255216B2' AND state=-1) AS RESULT
Поля в Таблицах MainStorage.id_record_storage и Income (Sold).id_record_storage имеют одинаковые идентификаторы...

Мне нужно результат второго поместить во внутрь первого, т.е. каждый артикул получает поле своего баланса...
Откровенно говоря "попал в колею", не вижу решения, пробовал разные вариации с присоединяемым таблицами, но не получается.
Посоветуйте пожалуйста решение...

Добавлено через 6 минут
Например, артикул с характеристиками был оприходован в кол-ве 75 штук за период, и выдан в кол-ве 70 штук за период, нужно приклеить результат выборки кода №2 в таблицу формируемую кодом №1
Ответ: Заработал!
Более точный код вот он (по задаче):
SQL
1
2
3
4
5
6
7
8
9
10
GO
SELECT A.description, A.Artikul,A.Cdescription, 
(SELECT (SELECT SUM(quantity) FROM Income WHERE id_record_storage = A.id_record_storage AND state=-1)-
(SELECT SUM(quantity) FROM Sold WHERE id_record_storage = A.id_record_storage AND state=-1) AS RESULT) AS RESULT 
FROM 
(SELECT MainID.description, MainStorage.Artikul,Companys.Description AS Cdescription, 
MainStorage.id_record,MainStorage.id_record_storage
FROM MainID
INNER JOIN (MainStorage INNER JOIN Companys ON Companys.ID_Company LIKE MainStorage.id_company)
ON   MainStorage.Artikul LIKE 'XX0080X2609' AND MainID.id_record LIKE MainStorage.id_record) AS  A  
Теперь борьба с NULL предстоит) , т.е. если был приход, но не было продаж, баланс Null) но это "совсем другая история" ))
Искренне благодарю за найденное решение, делаю вывод, про SELECT толковой справки не нашел....

Добавлено через 21 минуту
И для финала:
T-SQL
1
2
3
4
5
6
7
8
9
10
GO
SELECT A.description, A.Artikul,A.Cdescription, 
(SELECT (SELECT ISNULL(SUM(quantity),0) FROM Income WHERE id_record_storage = A.id_record_storage AND state=-1)-
(SELECT ISNULL(SUM(quantity),0) FROM Sold WHERE id_record_storage = A.id_record_storage AND state=-1) AS RESULT) AS RESULT 
FROM 
(SELECT MainID.description, MainStorage.Artikul,Companys.Description as Cdescription, 
MainStorage.id_record,MainStorage.id_record_storage
FROM MainID
INNER JOIN (MainStorage INNER JOIN Companys ON Companys.ID_Company LIKE MainStorage.id_company)
ON   MainStorage.Artikul LIKE 'XX0080X2609' AND MainID.id_record LIKE MainStorage.id_record) as  A  
Вопрос: сохранение результатов выборки

Здравствуйте, подскажите пожалуйста, есть ли возможность автоматизировать выгрузку результатов выборки в текстовый файл?
есть таблица со 100млн. строк, мне нужно уложить эти данные в csv файлы по 250 000 строк, вручную это долго, тем более учитывая, что эта задача может повториться, как можно автоматизировать данный процесс?
Спасибо
Ответ: Ну или как то можно "повозиться" с командой bcp out
Вопрос: Неожиданный результат

Привет всем.
Может кто знает, почему результаты выборок - разные?
declare @R table (x int)
declare @R2 table (x int)

insert into @R(x)
Values (0),(1),(2),(3);

insert into @R2(x)
Values (5),(1),(2),(3);

select l.x, r.x x2,coalesce(l.x,r.x) ,coalesce(r.x,l.x)
from @R l full join @r2 r on l.x = r.x
where coalesce(l.x,r.x) = coalesce(r.x,l.x)

select l.x, r.x x2,coalesce(l.x,r.x) ,coalesce(r.x,l.x)
from @R l, @r2 r
where coalesce(l.x,r.x) = coalesce(r.x,l.x)
Ответ:
Ovr777
почему результаты выборок - разные?
Потому что cross join это не full join.
Уберите предложение where у обоих запросов и сравните результат.
Вопрос: 2 таблицы с одинаковыми полями - результат уникальный ID и TOTAL

Необходимо 2 таблицы с описанием продуктов Prod_A и Prod_B, следующей структуры:


Prod_ID Код продукта Числовой
Prod_Name Название продукта Текстовый
Price Цена Числовой
Quantity Количество Числовой
Category_ID Код категории Текстовый

Как реализовать эти таблицы, если в результате выборки из двух таблиц ID должен быть уникальным и Total

Добавлено через 9 минут
Допустим если Код категории будет разнится, но Код продукта может совпасть
Ответ:
Сообщение от d123456
Как реализовать эти таблицы
Сообщение от d123456
следующей структуры
Есть структура делай
Сообщение от d123456
Как реализовать эти таблицы, результате выборки из двух таблиц ID должен быть уникальным
Затачивать таблицы под конкретный запрос - "тупизм" полный.
Вопрос: 2 ВАЛИДНЫХ, ЭКВИВАЛЕНТНЫХ запроса возвращают разные результаты. Выборка из одной таблицы.

Есть небольшая табличка примерно 2кк записей.
Делаю запрос следующего формата:

SELECT `id`, `asin`, `marketplace_id`
FROM `repricing_product`
WHERE
  (`marketplace_id` = 10 AND `asin` IN ('value',.....)) OR 
  (`marketplace_id` =  2 AND `asin` IN ('value',.....)) OR   
  (`marketplace_id` =  3 AND `asin` IN ('value',.....)) OR 
  (`marketplace_id` =  1 AND `asin` IN ('value',.....)) OR 
  (`marketplace_id` =  7 AND `asin` IN ('value',.....)) OR 
  (`marketplace_id` =  8 AND `asin` IN ('value',.....)) OR 
  (`marketplace_id` =  5 AND `asin` IN ('value',.....)) OR 
  (`marketplace_id` =  4 AND `asin` IN ('value',.....))


где количество значений в операторе IN достаточно велико (например, в условии с `marketplace_id` = 10 их более 9к).
Результирующая выборка не содержит данные, которые соответствуют условию запроса.

Как показал explain, при выполнении запроса используется составной индекс по полям `asin` и `marketplace_id`.
Переписал запрос на такой:

SELECT `id`, `asin`, `marketplace_id`
FROM `repricing_product`
WHERE
  (`asin`, `marketplace_id`) IN
  (
    ('value',10),....,
    ('value',2),....,
    ('value',3),....,
    ('value',1),....,
    ('value',7),....,
    ('value',8),....,
    ('value',5),....,
    ('value',4),....
  )


При выполнении этого запроса возвращаются все данные.

В итоге получается, что есть 2 ВАЛИДНЫХ, ЭКВИВАЛЕНТНЫХ запроса, которые на одинаковых данных возвращают разные результаты.

Из-за "толстого" оператора IN запрос достаточно тяжелый, но он не превышает лимит заданный в конфиге max_allowed_packet. Об ограничениях на количество значений в операторе IN в доках не пишут.
Удалось воспроизвести такое поведение на версиях: 5.6.35-log, 5.6.33-log, 5.6.39-83.1. Тут можно скачать дамп БД (одна таблица) и полные версии запросов с комментариями.

Что делал.

Менял порядок шествия значений в операторах IN - набор отсутствующих строк не менялся.
Если менять местами группы условий, разделенные оператором OR - результаты меняются. На это можно посмотреть если поменять местами (`marketplace_id` = 3 AND `asin` IN ('value',.....)) и (`marketplace_id` = 2 AND `asin` IN ('value',.....)) в примере запроса в файле.
Уменьшал количество значений в операторах IN - запрос возвращал правильный результат.

Помогите, плиз, понять в чем проблема и куда копать, чтобы не напороться на поведение как в первом запросе.
Ответ:
Dmitriy-CoDy
......
Удалось воспроизвести такое поведение на версиях: 5.6.35-log, 5.6.33-log, 5.6.39-83.1. Тут можно скачать дамп БД (одна таблица) и полные версии запросов с комментариями.
......
Вопрос: Как создать запрос на выборку SQL ?

Здравствуйте! Пожалуйста помогите решить вот такую задачку: "Сформулируйте на языке SQL команду, обеспечивающую выбор записей по одному условию из "полной таблицы" (по единственному условию в одном поле). Количество выбранных записей должно составлять от 30 до 50 % количества записей "полной таблицы". Текст команды и результат выборки при-ведите в виде отдельной таблицы со всеми полями." Благодарю!
Ответ: stalkerovich2, не могу понять условие задачи
Выборка по единственному условию в одном поле. Допустим надо выбрать у кого премия меньше 10000, то на выходе будет 6 записей, т.е. 60%. Так как надо 50%, делаем ограничение в 5 записей.
SQL
1
SELECT * FROM TABLE WHERE Premia < 10000 LIMIT 5
Или по полю VPL
SQL
1
SELECT * FROM TABLE WHERE Vpl = "Да" LIMIT 5
Вопрос: SQL проверка результата выборки

Добрый день, имеется запрос:
SELECT `sc`.`id`, `sc`.`type`, `sc`.`properties`, (SELECT `value` FROM `dveri_site_tmplvar_contentvalues` WHERE `tmplvarid` = '12' AND `contentid` = `sc`.`id` LIMIT 1) AS `price` FROM `dveri_site_content` `sc` WHERE `sc`.`id` IN (1285,169,163,161) ORDER BY ABS(`price`) asc LIMIT 0, 12


запрос в запросе выводит результат в поле price, как я понял. Нужно в условии where сравнить этот самый price с 0. Как только я не пробовал ничего не получается.
пробовал вот так:
1)WHERE `sc`.`id` IN (1285,169,163,161) AND `price`<>0
2)WHERE `sc`.`id` IN (1285,169,163,161) AND `sc`.`price`<>0
по всякому пробовал - не получается. В SQL не силён. Один человек сказал, что тут дело обстоит в том, что таблицы не связаны.

попробовал вот так:
SELECT `sc`.`id`, `sc`.`type`, `sc`.`properties` 
FROM `dveri_site_content` `sc`
        LEFT JOIN (SELECT `value` FROM `dveri_site_tmplvar_contentvalues`   WHERE `tmplvarid` = '12' AND `contentid` = `sc`.`id` LIMIT 1) AS `price`
        
        WHERE `sc`.`id` IN (1285,169,163,161) AND `price`<>0
        ORDER BY ABS(`price`) asc LIMIT 0, 12


но все равно ничего не получается. Что не так я делаю?

Модератор: Тема перенесена из форума "PHP, Perl, Python".
Ответ:
Akina
_madest
после ORDER BY ... выботку еще раз можно сделать???
Нет
_madest
я хочу вывести сначала записи с price <> 0, отсортировать их, а потом записи с price = 0

ORDER BY (price=0), остальные критерии сортировки


ёлки-палки, неделю бился, а вы мне так легко все подсказали)) Благодарю за помощь)
Вопрос: DB2, неожиданый результат выборки.

Возникла необходимость сравнить список с таблицей, соответственно создал таблицу и загрузил туда список(пусть будет таблица A). Сравниваю с таблицей Б по полю ID.
Таблица А - 196 записей.
Таблица Б - 210 000 записей.
DB2 9.7.9 (windows)

Делаю:
select * from А where id in (select id from Б);

получаю 51 запись.

Делаю:
select * from А where id NOT in (select id from Б);

и НЕОЖИДАННО, вместо 145 записей получаю 0.

А вот если:
select * from А where id NOT in (select id from А where id in (select id from Б));

то результат верный, 145 записей.

Уточню, после создания таблицы А ни сбора статистики, ни чего еще не проводилось(даже db2 не перезапускал).

Второй раз с таким сталкиваюсь, оба раза ситуация возникала с новыми(временными) таблицами созданными для оперативного сравнения списков.

Подозреваю, что дело в каком-нибудь оптимизаторе запросов, но моих знаний не достаточно для точных выводов.

Какие будут идеи?
Ответ: Товарищи, большое спасибо за ответы, и отдельное спасибо за примеры!!!
Вопрос: Помогите сформировать запрос по выборке из одной таблицы

Имеется таблица
со столбцами date, time, id, ip.

Необходимо сделать хитрую выборку:

1. Выбрать по ID (например 12345);
2. Из результата выборки по п.1 взять все значения ip и date и сделать по ним выборку из таблицы.

Для чего необходимо: есть известный номер пользователя, используя который нужно по IP-адресам вычислить остальные номера ID, которые он использовал. Загвоздка в том, что IP постоянно меняются.
При таком запросе:
SELECT * FROM table WHERE ip IN ( SELECT ip FROM table WHERE id = значение)
выдает результаты по датам, когда запись ID отсутствует. Таким образом, надо сделать выборку ID исходя из IP-адресов в рамках одной сессии. Помогите сформировать запрос, отвечающий всем необходимым критериям.
Заранее извиняюсь, если что-то где-то непонятно написал - учусь.
Ответ: Добрый Э - Эх, спасибо, помогло!
Подскажите, а как еще больше конкретизировать IP адрес?
Необходимо чтобы выбирало по тем IP, которые засветились именно в этот день, а не которые засветились за весь период.
Плз, хелп!!!
Вопрос: Выборка с исключением значений подгрупп (без агрегации), возможно ли?

Доброе время суток уважаемые формучане! =)
Столкнулся я недавно с задачей написания специфичного алгоритма наследования данных.
После нескольких часов моделирования понял что не могу понять как сделать сложную выборку в моем случае...

Суть задачи следующая:
Есть таблица с такой структурой:

* ID
* CreateYear - год создания записи (целое число)
* EID - собственный идентификатор объекта (записи), который является уникальным только в пределах CreateYear
* Value - значение записи
* Hidden - логическое значение

Таблица содержит иерархию записей, привязанных к определенному CreateYear (назовем их "физическим набором").
Каждая запись в пределах "физического набора" имеет свой уникальный EID, определяющий некоторый "объект".
Причем в разных "физических наборах" могут существовать записи с одинаковыми EID (более новые записи переопределяют старые при выборке).
Запись набора может иметь установленное значение "Hidden", означающее что текущая запись и вся ее иерархия наследования скрыта (не отображается в результате выборки).

Запрос должен формировать "логический набор", содержащий записи, CrateYear которых <= указанного значения, но при этом должны быть исключены все записи, с одинаковыми EID но остаться должны те из них, у которых CreateYear больший из выборки - это механизм наследования.

Например, есть такой фиктивный набор данных:


ID EID Value Hiden CreateYear
1 1 A 2010
2 2 B 2010
3 3 C 2010
4 4 D 2011
5 5 E 2011
6 2 XY 2011
7 3 - True 2012
8 6 G 2012

На этой таблице изображено 3 набора данных (2010, 2011, 2012):

в 2010 были добавлены 3 записи "A", "B", "C".
в 2011, к этому набору были добавлены "D" и "E", но запись с EID = 2 переопределена ("B" переименовано в "XY")
в 2012, скрыта запись с EID = 3 (запись "C" добавленная в 2010) и добавлена новая запись "G"

Запрос, при фильтре "CreateYear = 2011" должен возвращать следующий результат:

ID EID Value Hiden CreateYear
1 1 A   2010
3 3 C   2010
4 4 D   2011
5 5 E   2011
6 2 XY   2011

А при фильтре "CreateYear = 2012" (или больше):

ID EID Value Hiden CreateYear
1 1 A 2010
4 4 D 2011
5 5 E 2011
6 2 XY   2011
8 6 G 2012

Как можно выполнить подобный фильтр, с исключением повторяющихся значений по полю EID но с тем условием, чтобы оставались только записи с большим "CreateYear"?

Это похоже на группировку с исключением, но SQL GroupBY агрегирует значения указанных столбцов, без возможности исключения всех значения не соответствующие указанному фильтру в группе (без агрегирования)...
Ответ: mobile, все работает, спасибо) во внешнем запросе Where было излишним, вы ведь во внутреннем уже выполнили фильтрацию по году.