Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.05 c
2-1215985907
Zivas
2008-07-14 01:51
2008.08.17
Реально ли сделать это на делфи?


1-1196789989
Elhat
2007-12-04 20:39
2008.08.17
Определение многопользовательской / однопользовательской Windows


2-1215880025
AIK
2008-07-12 20:27
2008.08.17
Загрузить txt ресурс из dll в TStringList


15-1214914100
i
2008-07-01 16:08
2008.08.17
Delphi7 and Vista..


2-1215972445
Дима
2008-07-13 22:07
2008.08.17
Ошибка консольного приложения, при расчете CRC32 суммы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский