Форум: "Начинающим";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
ВнизПомогите с SQL запросом если не лень Найти похожие ветки
← →
DillerXX © (2008-07-11 19:43) [0]СУБД mySQL. Пусть есть таблицы t1 и t2. Каждая имеет вид
DATETIME `date`,
TEXT `name`
Мне нужно выбрать все записи обоих таблиц, добавив 3ий столбец, где стояло бы имя таблицы, а затем отсортировать полученную таблицу по возрастанию date. Тоесть нужно объединить результат запросов SELECT `name`, `date`, "tbl1" FROM `tbl1` (и для второй аналогично) и отсортировать по date. Ни одной идеи как это сделать (ведь SELECT (SELECT ...), по крайней мере в mySQL, не может принимать результат с более чем 1ой строкой). Может у UNION есть какие-то параметры, с помощью которых можно управлять резуьтатом обоих запросов, но ничего не нашёл.
ЗЫ. Пожалуйста, не оставляйте своё мнение по поводу mySQL, я всегда догадывался о нём.
← →
Johnmen © (2008-07-11 19:48) [1]
SELECT DATETIME, "t1" AS TableName, TEXT FROM t1
UNION
SELECT DATETIME, "t2", TEXT FROM t2
← →
Игорь Шевченко © (2008-07-11 19:50) [2]Johnmen © (11.07.08 19:48) [1]
+ order by datetime
← →
Johnmen © (2008-07-11 19:51) [3]
> Игорь Шевченко © (11.07.08 19:50) [2]
По умолчанию при юнион без ALL - order by 1, 2, 3, ...
← →
Игорь Шевченко © (2008-07-11 20:15) [4]Johnmen © (11.07.08 19:51) [3]
> По умолчанию при юнион без ALL - order by 1, 2, 3, ...
я-то по серости order by после union пишу. оно где-то, умолчание, прописано ?
← →
Johnmen © (2008-07-11 21:07) [5]
> Игорь Шевченко © (11.07.08 20:15) [4]
Конечно. В документации.
И не надо мне говорить, что ты не умеешь пользоваться поисковыми серверами...:)
Т.е. не надо думать, что я буду что-то искать. Мне это не интересно...
ЗЫ
И по поводу (в случае с юнион)
> order by datetime
стОит, наверное, ознакомиться с документацией.
← →
Игорь Шевченко © (2008-07-11 21:11) [6]Johnmen © (11.07.08 21:07) [5]
> Конечно. В документации.
Ты меня несколько не так понял - я спрашивал, это только к MySQL относится или вааще ? (ну типа в SQL-9x прописано...)
← →
sniknik © (2008-07-11 21:12) [7]> оно где-то, умолчание, прописано ?
в явном виде не видел... "дошел" подобного вывода по логике, UNION же без ALL убирает дубликаты записей (и вот это уже пишут явно), а как убирать дубли в несортированном списке? как программист программисту... %) это же сколько времени оно занимать будет, на переборах? а после, раз отсортированное, как восстановит оригинальный порядок? (без введений дополнительных столбцов в выборку)
т.что то, что оно так работает с сортировкой, это точно, но вот гарантий закрепленных в доках вроде нет, не видел (mssql/access).
← →
sniknik © (2008-07-11 21:14) [8]> это только к MySQL относится или вааще
это вааще везде где есть UNION. имхо (на случай какогонибудь crazy sql сервера).
← →
Johnmen © (2008-07-11 21:26) [9]
> Игорь Шевченко © (11.07.08 21:11) [6]
Типа в SQL-9x не прописано. В более поздних - не знаю.
Но упоминается в документации к конкретным sql серверам.
Всё. Больше ничего говорить не буду. Ибо что такое занудство, хорошо знаю...:)
← →
Игорь Шевченко © (2008-07-11 22:32) [10]Johnmen © (11.07.08 21:26) [9]
sniknik © (11.07.08 21:14) [8]
Аналогично, DISTINCT тоже возвратит отсортированный набор ?
Ну как программист программисту ?
← →
Игорь Шевченко © (2008-07-11 22:45) [11]отсортированный набор гарантировано возвращает только SELECT .... c ORDER BY. Все остальные утверждения есть ересь, туфта и лажа.
← →
sniknik © (2008-07-11 23:18) [12]> Аналогично, DISTINCT тоже возвратит отсортированный набор ?
а ты проверь.
← →
Игорь Шевченко © (2008-07-11 23:29) [13]sniknik © (11.07.08 23:18) [12]
А проверял. Фиги, неотсортирован
← →
sniknik © (2008-07-11 23:40) [14]оракл? вот он, crazy sql сервер. нашелся. ;о) или может всетаки не проверял? на память понадеялся.
у меня
SELECT Field1 FROM Table1 ORDER BY Field1
и
SELECT DISTINCT Field1 FROM Table1
дают одинаковые (при отсутствии повторов), отсортированные наборы, в отличие от результата такого запроса
SELECT Field1 FROM Table1
← →
Игорь Шевченко © (2008-07-12 00:02) [15]sniknik © (11.07.08 23:40) [14]
> оракл?
Оракл.
> или может всетаки не проверял? на память понадеялся.
Проверял, как можно не проверять.
> у меня
> SELECT Field1 FROM Table1 ORDER BY Field1
> и
> SELECT DISTINCT Field1 FROM Table1
> дают одинаковые (при отсутствии повторов), отсортированные
> наборы, в отличие от результата такого запроса
> SELECT Field1 FROM Table1
Ты же понимаешь, что все зависит от данных, огранизации таблиц, способов их соединения и многих других факторов.
В общем случае результат клауз DISTINCT и UNION неотсортирован, а в частных - а как фишка ляжет.
← →
Игорь Шевченко © (2008-07-12 00:21) [16]А собстна оно и написано
"A cursor in the open state identifies a table, an ordering of the rows of that table, and a position relative to that ordering. If the <declare cursor> does not contain an <order by clause>, or contains an <order by clause> that does not specify the order of the rows completely, then the rows of the table have an order that is defined only to the extent that the <order by clause> specifies an order and is otherwise implementation-dependent.
When the ordering of a cursor is not defined by an <order by clause>, the relative position of two rows is implementation-dependent. When the ordering of a cursor is partially determined by an <order by clause>, then the relative positions of two rows are determined only by the <order by clause>; if the two rows have equal values for the purpose of evaluating the <order by clause>, then
their relative positions are implementation-dependent."
страница 71
http://www.cse.iitb.ac.in/dbms/Data/Papers-Other/SQL1999/ansi-iso-9075-2-1999.pdf
← →
sniknik © (2008-07-12 00:29) [17]> Ты же понимаешь, что все зависит от данных, огранизации таблиц, способов их соединения и многих других факторов.
приведи вариант без сортировки.
> В общем случае результат клауз DISTINCT и UNION неотсортирован
отсортирован. оно так работает. и вряд ли может по другому (без специальных к этому усилий. т.е. написания другой обработки).
← →
Anatoly Podgoretsky © (2008-07-12 10:44) [18]
> is implementation-dependent
Расчитывать на что то конкретное не приходится. Приходится расчитывать только на шамана.
← →
Игорь Шевченко © (2008-07-12 11:40) [19]sniknik © (12.07.08 00:29) [17]
> приведи вариант без сортировки.
как ты себе это представляешь ? базу тебе скинуть ?
> отсортирован. оно так работает. и вряд ли может по другому
> (без специальных к этому усилий. т.е. написания другой обработки).
>
Нет, оно работает по-разному. В зависимости от реализации и в зависимости от оптимизатора. В тоже Oracle существуют соединения хешированием, сам понимаешь, ни о какой сортировке тут речи быть не может.
← →
sniknik © (2008-07-12 16:08) [20]> как ты себе это представляешь ? базу тебе скинуть ?
почему нет? любую тестовую (нет нужды в реальных данных) и запрос которым ты проверял из обсуждаемых, который убирает дубли но не сортирует.
хотя вообщето ждал другого, конкретного, примера данных с которыми не работает, вот прям сдесь, конструктивного обсуждения, объяснений каким образом вот конкретно ты (если бы делал ты) восстанавливал оригинальную последовательность списка из полученного "уборкой дублей"
например
1
2
5
6
10
12
если кроме этого списка данных больше нет (ну так оно и есть на самом деле)
или объяснений как должна работать "уборка" без сортировки, не нарушая оригинального порядка объединяемых выборок (UNION)
> Нет, оно работает по-разному.
ни разу не видел... пример можно? ну хотя бы в виде скриншота.
> В тоже Oracle существуют соединения хешированием
при чем тут соединения, или приведенная ранее справка о курсорах? мы же говорим о результирующем рекордсете, его специфической обработке командами UNION/DISTINCT.
> ни о какой сортировке тут речи быть не может.
если в результат (рекордсет) попал хеш и дубли убирались и по нему то будет и сортировка по нему ([3] -> order by 1, 2, 3, ...). только и делов то.
естественно ждать, что будет сортировано по какомуто надуманному критерию (типа хочу по полю Name) глупо, ее тогда скорее всего вообще не заметишь (желания видеть очевидное не навяжешь. убедить тоже не получится)...
Johnmen © (11.07.08 21:26) [9]
> Всё. Больше ничего говорить не буду. Ибо что такое занудство, хорошо знаю...:)
+1
← →
Игорь Шевченко © (2008-07-12 20:16) [21]
> почему нет? любую тестовую (нет нужды в реальных данных)
> и запрос которым ты проверял из обсуждаемых, который убирает
> дубли но не сортирует.
ну вот смотри, есть две таблицы t1 и t2
со столбцами country_code и cnt_name_int, в одной country_code уникальный, в другой нет
вот такой запрос:select distinct country_code,cnt_name_int from (
select country_code,cnt_name_int,count(*) from (
(select * from t1 union all select * from t2))
group by country_code,cnt_name_int)
/
Вот его последние N строкCO CNT_NAME_INT
-- --------------------------------
SR SURINAM
ST SAO TOME & PRINCIPE
TC TURKS & CAICOS ISLANDS
TG TOGO
UA UKRAINE
AZ BAKU
TH BANGKOK
SA JEDDAH
RU KRASNODAR
UZ NAMANGAN
US NEW YORK NY
CO CNT_NAME_INT
-- --------------------------------
CN BEIJING
VN HOCHIMINH
UZ SHAHRISABS
RU EKATERINBURG
KG CHOLPON-ATA
291 rows selected.
Вот его план:Execution Plan
----------------------------------------------------------
Plan hash value: 2821407142
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 293 | 6446 | 7 (15)| 00:00:01 |
| 1 | HASH GROUP BY | | 293 | 6446 | 7 (15)| 00:00:01 |
| 2 | VIEW | | 293 | 6446 | 6 (0)| 00:00:01 |
| 3 | UNION-ALL | | | | | |
| 4 | TABLE ACCESS FULL| T1 | 220 | 2860 | 3 (0)| 00:00:01 |
| 5 | TABLE ACCESS FULL| T2 | 73 | 803 | 3 (0)| 00:00:01 |
-----------------------------------------------------------------------------
ora10> select banner from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
← →
Johnmen © (2008-07-12 20:32) [22]
> Игорь Шевченко © (12.07.08 20:16) [21]
Игорь, я, конечно понимаю, что кич дороже понтов.
Но, м.б. стОит наконец то понять о чем речь?
← →
Игорь Шевченко © (2008-07-12 20:33) [23]Johnmen © (12.07.08 20:32) [22]
Речь о том, что для получения отсортированного набора в общем случае необходимо указывать ORDER BY
← →
Johnmen © (2008-07-12 20:35) [24]
> Игорь Шевченко © (12.07.08 20:33) [23]
А в частном?
Явно указывать или нет?
← →
Игорь Шевченко © (2008-07-12 20:44) [25]Johnmen © (12.07.08 20:35) [24]
А в частном оно implementation dependent...
← →
Johnmen © (2008-07-12 21:04) [26]
> Игорь Шевченко ©
Ну в общем то, очевидно, что с такими занудами, как ты, надо вести себя аналогично.
Итак.
> select distinct country_code,cnt_name_int from (select country_code,
> cnt_name_int,count(*) from ((select * from t1 union all
> select * from t2))group by country_code,cnt_name_int)
и
SELECT DATETIME, "t1" AS TableName, TEXT FROM t1
UNION
SELECT DATETIME, "t2", TEXT FROM t2
мне самому найти 10 отличий, или ты сам?
← →
Игорь Шевченко © (2008-07-12 21:06) [27]Johnmen © (12.07.08 21:04) [26]
Если ты прочитаешь ветку, то увидишь, что начиная с какого-то поста речь пошла не о конкретном запросе, а об общем поведении. Это с ветками случается, ничего страшного.
← →
Johnmen © (2008-07-12 21:09) [28]
> Игорь Шевченко © (12.07.08 21:06) [27]
Понятно...
Оставайся в плену своих комплексов.
← →
sniknik © (2008-07-13 01:42) [29]Игорь Шевченко © (12.07.08 20:16) [21]
в приведенном запросе distinct не срабатывает, видимо верхний селект
select distinct country_code,cnt_name_int from (
выкинут оптимизатором, он не нужен, т.к. результат внутреннего и так рекордсет с уникальными записями от group by
это видно по плану (нет записи DISTINCT SORT).
т.что этим ты доказал то с чем и так никто не спорит - "без order by порядок неопределен", но вовсе не то, что distinct не сортирует.
проверить кстати легко, просто сделать distinct нужным (для оптимизатора), чтобы отличался от внутреннего и его нельзя было выкинуть, например добавить действие над полем или обоими, типа обрезки части (добавление может не пойти, добавление к уникальному так и оставит его уникальным. может там оптимизатор супер ИИ...)
т.е. вместо
select distinct country_code,cnt_name_int from (
сделать
select distinct Left(country_code, 1), Right(cnt_name_int, 10) from (
или чего там в оракле за функции есть. не знаю.
← →
Германн © (2008-07-13 02:20) [30]Удалено модератором
← →
sniknik © (2008-07-13 11:38) [31]Удалено модератором
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.04 c