Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > отображение результата


Автор: 4ybaka 15.10.2007, 21:14
нужно в зависимости от результата запроса в одном столбце вывести либо столбец из одной таблицы,либо столбец из другой.как это можно реализовать?

Автор: SergKO 16.10.2007, 08:27
используйте CASE

Автор: 4ybaka 16.10.2007, 15:46
уже пробовал,но опыта пока для этого не хватает... smile 

Автор: SergKO 16.10.2007, 16:08
Приведите запрос, и покажите из каких полей надо выбирать.

Автор: 4ybaka 16.10.2007, 17:33
Цитата

Найти покупателей и продавцов, которые живут в одном городе. Если в городе живут только один или 
несколько продавцов или только один или несколько покупателей, то информация о таких покупателя и продавцах не 
должна попадать в результирующий набор. Не использовать конструкцию JOIN. 
В результатах запроса необходимо вывести следующие заголовки для результатов запроса: ‘Person’, ‘Type’ 
(здесь надо выводить строку ‘Customer’ или  ‘Seller’ в завимости от типа записи), ‘City’. 

база NorthWind
у меня запрос получился такой:
Код

select E.LastName,C.ContactName,E.City from Customers C,Employees E where C.City=E.City 

но в нем вместо E.LastName и C.ContactName нужно вывести один столбец ‘Person’,значение в кот либо из E.LastName либо из C.ContactName.и еще добавить столбец ‘Type’,кот также необходимо заполнить как указано выше.

Автор: SergKO 17.10.2007, 06:16
Очень похоже на упражнение на sql-ex. Давайте так, полностью Вы запрос напишите сами, а пример использования CASE вот
Код

select Person = case    when E.LastName is null and C.ContactName is not null then C.ContactName 
            when E.LastName is not null and C.ContactName is null then E.LastName
            else ''
        end,
    Type =    case    when E.LastName is null and C.ContactName is not null then 'Customer'
            when E.LastName is not null and C.ContactName is null then 'Seller'
            else ''
        end
        ,E.City 
from Customers C,Employees E where C.City=E.City 

Автор: 4ybaka 17.10.2007, 18:41
на сколько я знаю,при таком соединении таблиц(скалярное произведение вроде) у нас в каждой строчке будет и E.LastName и C.ContactName,те ни один из них не будет is null.значит всегда будет выводиться пустая строка...подскажите хотя бы в какую сторону копать.

Автор: Servena 17.10.2007, 21:43
Использую Northwind, попробуй так:
Код

SELECT c.ContactName AS Person, 'Customer' AS Type,c.City AS City
FROM Customers AS c
WHERE EXISTS (
              SELECT e.City 
              FROM Employees AS e
              WHERE e.City=c.City
              )
UNION ALL
SELECT e.FirstName+' '+e.LastName AS Person, 'Seller' AS Type,e.City AS City
FROM Employees AS e
WHERE EXISTS (
              SELECT c.City 
              FROM Customers AS c
              WHERE e.City=c.City
              )

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

Добавлено через 23 секунды
Использую Northwind, попробуй так:
Код

SELECT c.ContactName AS Person, 'Customer' AS Type,c.City AS City
FROM Customers AS c
WHERE EXISTS (
              SELECT e.City 
              FROM Employees AS e
              WHERE e.City=c.City
              )
UNION ALL
SELECT e.FirstName+' '+e.LastName AS Person, 'Seller' AS Type,e.City AS City
FROM Employees AS e
WHERE EXISTS (
              SELECT c.City 
              FROM Customers AS c
              WHERE e.City=c.City
              )

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

Добавлено через 3 минуты и 8 секунд
Два раза одно и тоже - это глюкануло, не отправлялось долго и т.д. 

Автор: 4ybaka 17.10.2007, 22:12
Servena, спасибо за помощь,но я виноват,надо было сразу все ограничения дать... smile 
вообщем тема задания была такая:
Цитата

Явное соединение таблиц, самосоединения, использование агрегатных функций и предложений GROUP BY и HAVING 

так что union здесь использовать нельзя.я тоже хотел smile 

Автор: Servena 18.10.2007, 06:35
Ну так а в предыдущих примерах использовалось тоже соединение, но только оно написано в станом синтаксисе(без слова джоин). Какая разница?! Но я еще подумаю над этим. А временные таблицы использовать можно?

Автор: Servena 18.10.2007, 09:51
Так, после разговора с "экспертами" можно с уверенность сказать, что использовать данные с двух разных таблиц, не использую соединения 
их - невозможно. 
Теперь нужно разобраться с условием задачи: Явное соединение таблиц, самосоединения, ... - что это значит? А что есть не явное соединение? Или не так, используя синтаксис типа: from Customers C,Employees E - можно ли его назвать неявным соединением? Я думаю что нет, поскольку это обычный синтаксис MS SQL до 6.5 версии, другого тогда не было, т.е. это обычная старая (явная) запись объединения(методом пересечения, в стандарте ANSI это называется CROSS JOIN).
Таким образом прихожу к заключению - нужно уточнить условие задачи, т.е. расшифровать, что значит "неявное" соединение, потому что без  соединения тут не обойтись.

Автор: 4ybaka 18.10.2007, 19:28
 smile 
Цитата(Servena @  18.10.2007,  09:51 Найти цитируемый пост)
т.е. расшифровать, что значит "неявное" соединение

точно не знаю, есть ли вообще такое...)в задании сказано:
Цитата

Явное соединение таблиц


Цитата(Servena @  18.10.2007,  09:51 Найти цитируемый пост)
Так, после разговора с "экспертами" можно с уверенность сказать, что использовать данные с двух разных таблиц, не использую соединения их - невозможно. 

их соединять можно,даже нужно.просто ограничения по поводу join относятся к outer join и другим доп-ым возможностям.

Цитата(Servena @  18.10.2007,  06:35 Найти цитируемый пост)
 А временные таблицы использовать можно?

нет

Автор: Servena 18.10.2007, 20:13
Итак, подведем итог: 
1. Cоединение можно использовать, но не внешнее (OUTER LEFT JOIN, OUTER LEFT JOIN).
2. Пересечение таблиц (CROSS JOIN) тоже нельзя использовать.
3. Объединение (UNION) - нельзя.
4. Внутренее соединение (INNER JOIN) можно.
Правильно?

И еще, расшифруй тогда что такое  "Явное соединение таблиц".

Автор: 4ybaka 18.10.2007, 20:47
да,все правильноsmile

http://technet.microsoft.com/ru-ru/library/ms174149.aspx
Цитата

При использовании явного синтаксиса JOIN результат JOIN будет явным. Если в предложении FROM имеется список таблиц, разделенных запятыми, это неявное объединение таблиц векторным произведением.


по поводу 1 и 2 пункта - эти соединения встречаются немного позже...

Автор: Servena 19.10.2007, 08:33
Еще раз повторюсь:
Код
...FROM table1, table2 ...
 это все равно что 
Код
...FROM table1 CROSS JOIN table2...

Мне просто интересно, как можно назвать старый синтаксис "неявным" соединением, а стандартный синтаксис - явным?! И где это
изучают перекрестное соединения, начиная с устаревшего синтаксиса, а потом уже учат стандартный? В любой книге приводится
сначала стандартный синтаксис а потом в качестве обзора - устаревший, чтобы люди не конфузились, если вдруг его повстречают.
Ну да ладно, хвала нашим преподавателям!
Не знаю как это сделать с помощью перекрестного соединения - буду с нетерпением ждать, может у кого получится.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)