Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

JOIN_DISTINCT

1.8K
18 сентября 2010 года
Kama
153 / / 04.05.2006
Доброго время суток!
У меня появился такой вопрос...
Есть две таблицы со свызью 1-> n, при обьединении у меня соответственно дублируются данные скажем так:

===table1 ===
+------------+
| id |
+------------+
| a |
+------------+
| b |
+------------+


===table2===

+------------+------------+
| t1_id | col1 |
+------------+------------+
| a | 5 |
+------------+------------+
| a | 10 |
+------------+------------+
| b | 15 |
+------------+------------+
| b | 20 |
+------------+------------+

SQL :

SELECT id,TABLE2.col1 FROM TABLE1
LEFT JOIN TABLE2 ON TABLE2.id = TABLE1.id

+------------+------------+
| id | TABLE2.col1|
+------------+------------+
| a | 5 |
+------------+------------+
| a | 10 |
+------------+------------+
| b | 15 |
+------------+------------+
| b | 20 |
+------------+------------+


Надо было сделать так;

+------------+------------+
| id | TABLE2.col1|
+------------+------------+
| a | 10 |
+------------+------------+
| b | 20 |
+------------+------------+

Написал так
SQL :

SELECT id FROM TABLE1
LEFT JOIN (SELECT MAX(col1) FROM TABLE2) ON TABLE2.id = TABLE1.id

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

+------------+------------+
| id | TABLE2.col1|
+------------+------------+
| a | null |
+------------+------------+
| b | null |
+------------+------------+

Хотелось бы узнать как можно написать этот запрос по другому....
2
18 сентября 2010 года
squirL
5.6K / / 13.08.2003
Цитата: Kama

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


это не баг разработчиков. это вы не знаете SQL.
вообще, чтобы получить

 
Код:
+------------+------------+
| id         | col        |
+------------+------------+
| a          | 10        |
+------------+------------+
| b          | 20        |
+------------+------------+


вообще не нужно никаких связываний таблиц. нужно сделать

SELECT id, MAX(col) FROM table GROUP BY id;
1.8K
20 сентября 2010 года
Kama
153 / / 04.05.2006
возможно пример получился не самым хорошим, но в моем случае обьединять таблицы надо, так как данные находятся в разных таблицах, учитывая этот факт как написать такой запрос?
385
20 сентября 2010 года
SomewherSomehow
477 / / 25.07.2004
а зачем вам обязательно джойнить, если всерно колонки выводятся только одной таблицы? или это вы упрощенный пример привели?
а насчет запроса, просто добавьте к тому запросу, что привел вам squirL, ту таблицу, что необходимо сджойнить,
чтоб получилось типа такого..
SELECT t1.id, MAX(t1.col) FROM table t1 join table2 t2 on t1.id = t2.id GROUP BY t1.id;
2
20 сентября 2010 года
squirL
5.6K / / 13.08.2003
Цитата: Kama
возможно пример получился не самым хорошим, но в моем случае обьединять таблицы надо, так как данные находятся в разных таблицах, учитывая этот факт как написать такой запрос?



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

1.8K
23 сентября 2010 года
Kama
153 / / 04.05.2006
1. Маразм написали до меня
2. Для меня итак понятно что JOIN - это затратно для БД.
3. Менять структуру БД я не намерен, во первых потому что менять мне никто не позволит, во вторых поменяв однажды я не хочу потом сидеть вечность и исправлять под новое "что-то", там итак все запутанно.
4. Поверхностно скажу что я просто дописываю работающее "что-то" как-бы подстраиваясь....
5. Если возникли проблеммы такого рода которые я не могу найти в интернете, или не могу решить за долгое время я ищу поддержку на сайте.
6. Написав пусть даже плохой пример можно понять суть проблеммы, пусть даже и такая структура, маразм как вы говорите "уважаемый" SQUIRL не все такие "умные" как вы....
7. Я не первый раз кстати сталкиваюсь с такой проблеммой и как быть, а точнее какой запрос(тактика такого запроса какой должна быть) не знаю.
8. В сложившийся ситуации я "ПРОСТО" хочу увидеть запрос от профессионалов а не лекции про-то что я не знаю SQL. Да признаю я вглубь не вникал но на таком уровне на каком я сейчас его знаю мне пока хватает.
10
23 сентября 2010 года
Freeman
3.2K / / 06.03.2004
Вы не написали, что надо получить. Приведенный пример можно трактовать как "получить id и максимальное значение col1 из table2". Если это является конечным условием задачи, запрос squirl-а её решает.

Если же надо получить ещё какие-то поля из table1, тогда да, потребуется объединение, возможно даже внешнее. Нужны условия решаемой задачи.

Вы также не указали сервер, под которым всё делается.
1.8K
23 сентября 2010 года
Kama
153 / / 04.05.2006
Если бы задача состояла в этом бы.... Так нет...
как раз таки надо выбрать из одной таблицы данные причем которые могу дублироватся, здесь можно использовать оператор DISTINCT, никаких проблем, теперь надо выбрать данные из другой таблицы грубо говоря toje оператором DISTINCT, но оператор DISTINCT при обьединении не прокатывает...
385
24 сентября 2010 года
SomewherSomehow
477 / / 25.07.2004
[QUOTE=Kama]1. Маразм написали до меня[/QUOTE]
Ага-ага..."запрос не мой, я просто разместил объяву"
[QUOTE=Kama]2. Для меня итак понятно что JOIN - это затратно для БД.[/QUOTE]
В таком случае вам тем более должно быть понятно, что задача, в том виде в каком вы ее сформулировали, мягко говоря - странная. любого думающего человека она заставит насторожиться как минимум. Тогда либо указывайте, что привели упрощенный пример и тогда ясно что другим неведомо зачем вам это, либо указывайте конкретную причину зачем это надо - но т.к. вы ничего из этого не сделали - это позволяет заподозрить, что вы новичок, и просто не видите этой очевидной прорехи и дать вам совет относительно этого.
[QUOTE=Kama]3. Менять структуру БД я не намерен, во первых потому что менять мне никто не позволит, во вторых поменяв однажды я не хочу потом сидеть вечность и исправлять под новое "что-то", там итак все запутанно.
4. Поверхностно скажу что я просто дописываю работающее "что-то" как-бы подстраиваясь....[/QUOTE]
А сидеть и вечность клепать такие заплатки, которые потом будут тормозить хотите? Это все равно что подпирать палками стены прогнившего сарая, вместо того чтобы построить новые стены. Откройте для себя рефакторинг. И это называется не "подстраиваюсь", а - маскирую говнокод.
[QUOTE=Kama]5. Если возникли проблеммы такого рода которые я не могу найти в интернете, или не могу решить за долгое время я ищу поддержку на сайте.[/QUOTE]
Только делаете это в весьма странной, агрессивной манере.
[QUOTE=Kama]6. Написав пусть даже плохой пример можно понять суть проблеммы, пусть даже и такая структура, маразм как вы говорите "уважаемый" SQUIRL не все такие "умные" как вы....[/QUOTE]
Правильно, подпирайте и дальше палками свой сарай, пусть стены плохие, палки-то хорошие! Дубовые!
[QUOTE=Kama]7. Я не первый раз кстати сталкиваюсь с такой проблеммой и как быть, а точнее какой запрос(тактика такого запроса какой должна быть) не знаю.[/QUOTE]
Щито??
[QUOTE=Kama]8. В сложившийся ситуации я "ПРОСТО" хочу увидеть запрос от профессионалов а не лекции про-то что я не знаю SQL. Да признаю я вглубь не вникал но на таком уровне на каком я сейчас его знаю мне пока хватает.[/QUOTE]
Во первых, не такая это и глубь, во-вторых - уровня явно не хватает, в третьих помните, что вам тут никто ни чем не обязан!! а то я знаете ли тоже много чего хочу..

И в целом, я понимаю что могут быть разные причины по которым вы не можете менять структуру базы: вы недостаточно настойчивы или убедительны чтобы доказать начальству что такой подход с заплатками - это путь в никуда; вы сильно ограничены во времени и физически не успееете поменять базу т.к. должны выкатить изменения раньше; вас наняли только для этих исправлений и ваша задача их сделать, получить бабло и дальше хоть трава не расти и много-много других причин. В любом случае их надо указывать. Тогда людям будут понятны ваши мотивы и никто не будет вас учить. А раз уж вы сами допустили промашку ничего никому не сказав - то извольте выслушать и советы и порицания. Если они вам кажутся несправедливыми - следует извиниться, за то что ввели людей в заблуждение, и сказать что забыли уточнить то-то и то-то! При этом не забывая про тон.
385
24 сентября 2010 года
SomewherSomehow
477 / / 25.07.2004
Цитата: Kama
Если бы задача состояла в этом бы.... Так нет...
как раз таки надо выбрать из одной таблицы данные причем которые могу дублироватся, здесь можно использовать оператор DISTINCT, никаких проблем, теперь надо выбрать данные из другой таблицы грубо говоря toje оператором DISTINCT, но оператор DISTINCT при обьединении не прокатывает...


Да шо вы говорите? А у меня на ms sql прокатывает...

 
Код:
declare @t1 table (a int)
declare @t2 table (b int)
insert into @t1 select 1
insert into @t2 select 1
select distinct t1.a, t2.b
from @t1 t1 join @t2 t2 on t1.a = t2.b

как быть??
А вам сервер пишет в ответ на ваш запрос
 
Код:
select distinct t1.a, t2.b
from @t1 t1 join @t2 t2 on t1.a = t2.b
_______________________________
Msg 50000, Level 11, State 1, Line 1
Извините, но оператор DISTINCT при обьединении не прокатывает...

??
Если нет, то неплохо бы привести все-таки текст ошибки и запрос, а так же струтуру таблиц как она есть. Так же вам уже Freeman намекнул что неплохо бы указывать сервер! Правда в ответ на это почему-то опять видим невнятные коментарии? Вы сюда вообще за помощью пришли или просто поговорить? Если поговорить - есть соседний раздел Общалка. А то вы не указываете ни сервер, ни реальную структуру таблиц, ни тестовые данные, ни текст запроса который у вас не работает, ни текст ошибки, а то что указали - оказывается это все не то, т.к., хотя запросы которые вам дали и приводят к указанному вами же результату - вам они не нравятся! при этом причин вы тоже не раскрываете...интересно как вам помочь в таких условиях и захочет ли кто-нибудь это делать вообще - учитывая ваш стиль общения.
2
24 сентября 2010 года
squirL
5.6K / / 13.08.2003
пионеры такие пионеры... вместо того чтобы взять и прочитать за неделю книжку страниц на 300, неделями разводят какую-то малопонятную ерундень на форуме.
типа
Цитата:
7. Я не первый раз кстати сталкиваюсь с такой проблеммой и как быть, а точнее какой запрос(тактика такого запроса какой должна быть) не знаю.


Цитата:
Да признаю я вглубь не вникал но на таком уровне на каком я сейчас его знаю мне пока хватает.


взаимоисключающие параграфы - "на лице". а автора и не смущает.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог