SQL Join?

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 14:41

Код: Выделить всё
"SELECT * FROM [Profiles] JOIN [UsersCredentials] ON Profiles.ID = UsersCredentials.ProfileID JOIN [UsersApplications] ON Profiles.ID = UsersApplications.ProfileID"


Имею вышеуказанный синтаксис. На выходе получаю только индексы записей в привязанных таблицах, однако желаю получать готовые значения. Как? (MS SQL)
И вы думаете, что вас оставят в живых после прочтения этого поста?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: SQL Join?

Сообщение ANDLL » 14.05.2009 (Чт) 14:48

Че?
И почему все так любят join on вместо простого where?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 14:50

бред
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 14:52

Короче мне надо считать сам профайл, его credentials (которых может быть много) и applications (также много) - все разом
И вы думаете, что вас оставят в живых после прочтения этого поста?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 14:53

Williams писал(а):Короче мне надо считать сам профайл, его credentials (которых может быть много) и applications (также много) - все разом


А проблема то в чем??
С уважением,
Игорь Шувалов aka Ronin

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: SQL Join?

Сообщение ANDLL » 14.05.2009 (Чт) 14:54

Конструкция select * from a,b,c where a.x = b.y and b.z = c.ю
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 14:56

ANDLL писал(а):Конструкция select * from a,b,c where a.x = b.y and b.z = c.ю


хы, так просто? Тогда в чем фишка юзать Join?
И вы думаете, что вас оставят в живых после прочтения этого поста?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 14:57

ANDLL писал(а):Конструкция select * from a,b,c where a.x = b.y and b.z = c.ю


ИМХО microsoft запросы лучше, т.к. способом, который ты указал можно сделать не все
С уважением,
Игорь Шувалов aka Ronin

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 14:59

Либо я чего то не понимаю, либо я чего то не заметил, но в чем проблема была? Не работал запрос?
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 15:02

Еще забыл указать: в UsersApplications хранятся только индексы имеющихся у пользователя приложений. В то время как в "Applications" хранятся сами данные о приложениях. (видимо в этом загвоздка была). Как их оттуда выдрать в одном же запросе?
Последний раз редактировалось Williams 14.05.2009 (Чт) 15:02, всего редактировалось 1 раз.
И вы думаете, что вас оставят в живых после прочтения этого поста?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: SQL Join?

Сообщение ANDLL » 14.05.2009 (Чт) 15:02

Тогда в чем фишка юзать Join?
В том виде который привел ты - бестолку. У джойн есть другие применения
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: SQL Join?

Сообщение ANDLL » 14.05.2009 (Чт) 15:03

Изъясняйся в простых терминах, описание таблиц и связи полей, желательно в виде abc
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 15:05

INNER JOIN Applications ON Applications.ID = UsersApplications.ApplicationID добавь
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 15:07

4 таблицы:

Applications (приложения)
Profiles (пользовательские профайлы)
UsersApplications (пользовательские приложения - привязка к Profiles и Applications)
UsersCredentials (пользовательские данные, пара логин-пароль, привязка к Profiles)


По имени профайла надо получить список его приложений и credentials.

Затем все это будет паковаться в пользовательский класс вида


Class Profile
Applications
Credentials
...
End Class
И вы думаете, что вас оставят в живых после прочтения этого поста?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 15:11

Код: Выделить всё
SELECT     UserCrentials.*, Applications.*
FROM Profiles   INNER JOIN UserCrentials  ON ....
            INNER JOIN UserApplications ON ....
            INNER JOIN Applications ON ....


Но лучше разбить на 2 запроса отдельно: Applications и UserCrentials
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 15:18

Ronin писал(а):Но лучше разбить на 2 запроса отдельно: Applications и UserCrentials


Какие приемущества?
И вы думаете, что вас оставят в живых после прочтения этого поста?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 15:25

Williams писал(а):
Ronin писал(а):Но лучше разбить на 2 запроса отдельно: Applications и UserCrentials


Какие приемущества?


если в UsersCredentials 1 строка то никаких.. А вот если несколько то либо придется использовать последующую группировку либо DISTINCT.
При такой схеме, когда 2 таблицы связываются с 1 то получается так что из каждой строки таблицы Profiles получится (Количество строк, связанных из UsersApplications * количество связанных из UsersCredentials) строк. То есть получится по сути Cross Join
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 15:27

UsersCredentials может быть несколько на 1 профайл. В каком случае как быть?
И вы думаете, что вас оставят в живых после прочтения этого поста?

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 15:33

Смотри, у тебя к примеру таблицы A, B, C... Как в твоем случае, связка идет так - FROM A INNER JOIN B ON A.BID = B.BID INNER JOIN C ON A.CID = C.CID
К примеру у тебя в таблице A (читай Profiles) 1 строка (то есть их много но рассматриваем мы одну)
По связке к ней привяжутся 2 строки из B и 2 строки из С. Тогда в итоге у тебя на выходе будет 4 строки

Williams писал(а):UsersCredentials может быть несколько на 1 профайл. В каком случае как быть?


Все зависит от задачи, которая перед тобой стоит..
С уважением,
Игорь Шувалов aka Ronin

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 14.05.2009 (Чт) 15:38

Если в связке Profiles и UsersCredentials джойнятся по 1 записи, то все нормально, а если у одного профиля несколько UsersCredentials и несколько UsersApplications то я бы предпочел выбрать сначала Applications, затем Credentials (это в том случае если ты выбираешь только одну запись (WHERE Profiles.ID = #). Если же тебе надо сразу получить все, то потом придется группировать
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 14.05.2009 (Чт) 18:22

Задача решена совместными усилиями, во многом благодаря Ronin :)
И вы думаете, что вас оставят в живых после прочтения этого поста?

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: SQL Join?

Сообщение SLIM » 14.05.2009 (Чт) 22:04

Вообще подробнее нужно было структуру описывать, с полями и т.д.
А то не ясно где у тебя что цепляется и по каким полям.
Вообще, поидее, inner join не должен исказить данные и сопоставить каждой записи одной таблицы все записи другой, зачем только лишняя группировка не пойму (Ronin ?)
Пишите жизнь на чистовик.....переписать не удастся.....

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 15.05.2009 (Пт) 8:35

SLIM писал(а):Вообще подробнее нужно было структуру описывать, с полями и т.д.
А то не ясно где у тебя что цепляется и по каким полям.


+1

SLIM писал(а):Вообще, поидее, inner join не должен исказить данные и сопоставить каждой записи одной таблицы все записи другой, зачем только лишняя группировка не пойму (Ronin ?)


Хм, INNER JOIN Выводит записи один-к-одному, т.е. все связанные, а не каждой записи одной все записи другой.
Под группировкой я имел ввиду не GROUP BY (она тут не уместна), а группировка в пост обработке строк foreach'ем.. Т.к запрос возвращает разносторонние записи (одна таблица с PK и две с FK), то возвращать их в одном запросе мне кажется неприемлемым.
Как оказалось мы с Williams не так друг друга поняли. Ему не надо было получать эти данные именно в одном запросе. И все удачно решили, сделав 2 запроса через точку с запятой в одно обращение к серверу
С уважением,
Игорь Шувалов aka Ronin

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: SQL Join?

Сообщение Williams » 15.05.2009 (Пт) 13:00

Может кому пригодится:

Код: Выделить всё
"SELECT     Applications.name, Applications.action FROM         Profiles INNER JOIN " & _
                      "UsersApplications ON Profiles.id = UsersApplications.profileid INNER JOIN " & _
                      "Applications ON UsersApplications.applicationid = Applications.id WHERE Profiles.Name = @ProfName;" & _
"SELECT     UsersCredentials.name, UsersCredentials.value " & _
"FROM         Profiles INNER JOIN " & _
                      "UsersCredentials ON Profiles.id = UsersCredentials.profileid WHERE Profiles.Name = @ProfName"
И вы думаете, что вас оставят в живых после прочтения этого поста?

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: SQL Join?

Сообщение SLIM » 15.05.2009 (Пт) 22:13

Смотрел смотрел я на запрос, смотрел смотрел....
Слушай, а почему не с'inner join-ть все сразу в одном запросе?
Как Ronin и сказал, всы выберется один-к-одному. Выводится в итоге четыре поля. Две таблицы соединяются по "id prof"-а, и один раз по idapp
Советую inner-ить UserCred не к ProFiles, а к UserApp, а потом все это дело цеплять к App.

И ошибок я думаю не будет
Пишите жизнь на чистовик.....переписать не удастся.....

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Re: SQL Join?

Сообщение Ronin » 16.05.2009 (Сб) 12:49

SLIM писал(а):Смотрел смотрел я на запрос, смотрел смотрел....
Слушай, а почему не с'inner join-ть все сразу в одном запросе?
Как Ronin и сказал, всы выберется один-к-одному. Выводится в итоге четыре поля. Две таблицы соединяются по "id prof"-а, и один раз по idapp
Советую inner-ить UserCred не к ProFiles, а к UserApp, а потом все это дело цеплять к App.

И ошибок я думаю не будет


Ну ты создай примерно такую же структуру и попробуй сделать проще. Я не говорю, что нельзя сделать одним запросом. Просто тогда придется использовать пост обработку результата
Правильно, 4 поля. 2 из одной таблицы и 2 из другой. Причем они будут объеденены по Cross Join (каждая с каждой)
С уважением,
Игорь Шувалов aka Ronin

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: SQL Join?

Сообщение SLIM » 18.05.2009 (Пн) 21:36

Я не понял почему Cross то...ладно, нарисую схемку, разберем потом
Пишите жизнь на чистовик.....переписать не удастся.....


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 65

    TopList