Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.31;
Скачать: CL | DM;

Вниз

Помогите пожалйста с запросом   Найти похожие ветки 

 
AM   (2002-10-11 15:57) [0]

Как сделать внешнее связывание (OUTER JOIN). Обясню на простом примере:
Goods - товары
| ID | NName | .... ID - ключ.

Orders - заказы
| ID | QTY | ...


SELECT T1.NName, T2.QTY
FROM Goods T1, Orders T2
WHERE T1.ID = T2.ID

Выдает:

ЯБЛОКИ 1
ГРУШИ 10
ВИШНЯ 5

А надо чтобы выдавало:

ЯБЛОКИ 1
БАНАНЫ
ГРУШИ 10
ДЫНИ
ВИШНЯ 5

т. е. даже те у которых нет в таблице T2.
Я знаю, что в Oracle можно написать:

SELECT T1.NName, T2.QTY
FROM Goods T1, Orders T2
WHERE T1.ID = T2.ID(+)

А как в MSSQL?


 
Johnmen ©   (2002-10-11 16:06) [1]

SELECT T1.NName, T2.QTY FROM Goods T1
OUTER JOIN Orders T2 ON T1.ID = T2.ID



 
AM   (2002-10-11 16:32) [2]

Не сочтите за назойливость, но у меня T2 - это отдельный запрос, да еще в конце условие, и когда я пишу:

SELECT T1.NName, T2.QTY FROM Goods T1
OUTER JOIN ( SELECT ... ) T2 ON T1.ID = T2.ID
WHERE ...

то он выдает 2 ошибки
1-я:
Incorrect syntax near the keyword "OUTER".
2-я:
Incorrect syntax near "T2".

Подскажите, пожалуйста, как быть в этом случае?

А если честно у меня идет запрос на три таблицы:

SELECT T1.ID, T1.Rec_ID, T1.C_ID, T1.Rec_Date, T1.Act_Date, T1.Act_Time, T1.B_Type, T1.P_Type, T1.O_Type,
T1.Cont_NName, T1.Cont_Phone, T1.Delivery, T1.Del_Address, T1.Del_NName, T1.Del_Phone, T1.Downpayment,
T1.Nak, T1.Closed, T1.About, T2.NName AS [C_NName], T2.Phone AS [C_Phone], T2.PC_Firm, T2.C_Type,
T3.Nak, T3.SDate, T3.Discount, T3.Suma, T3.Suma - T1.Downpayment AS [AtLast]
FROM Orders T1, Clients T2,
( SELECT WayBills.Nak, WayBills.SDate, WayBills.Discount,
SUM(WayBills.How * WayBills.OutPrice*(100 - WayBills.Discount)/100) AS [Suma]
FROM WayBills WHERE WayBills.Doc_Type = 3 GROUP BY WayBills.Nak, WayBills.SDate, WayBills.Discount ) T3
WHERE T1.C_ID = T2.ID AND T1.Closed = 1 AND T1.P_Type = 0 AND T1.Nak = T3.Nak

и надо соединить запрос по полям T1.Nak ~ T3.Nak


 
Johnmen ©   (2002-10-11 16:46) [3]

Уточни сам синтаксис внешнего соединения по докам (я не помню)..
Общая идея :
SELECT ...,(SELECT...) FROM Goods T1
OUTER JOIN Clients T2 ON T1.ID = T2.ID
WHERE T1.Closed = 1 AND T1.P_Type = 0 AND T1.Nak = T3.Nak



 
AM   (2002-10-11 17:41) [4]

>Johnmen ©

Я тут поспрашивал спецов MSSQL, если интересно вот более точный ответ:

SELECT T1.NName, T2.QTY
FROM Goods T1, Orders T2
WHERE T1.ID *= T2.ID
т. е. вместо равенства (=) надо использовать (*=)

либо использовать LEFT JOIN



 
DmitryK ©   (2002-10-11 19:17) [5]

бррр... как все сложно

*= - это ничто иное как старая запись Right Outer Join (т.е. для старых версий)

OUTER JOIN такого объединения в MSSQL нет. Right Outer Join и Left Outer Join (выбирай такое как тебе надо), и вообще слово OUTER можно опускать.

а во и твой запрос

SELECT T1.NName, T2.QTY FROM Goods T1 LEFT JOIN ( SELECT ... ) T2 ON T1.ID = T2.ID
WHERE ...



 
wicked ©   (2002-10-11 22:55) [6]

поправлю....
для derived таблиц парсер любит видеть as, то есть запрос должен выглядеть так:

> DmitryK © (11.10.02 19:17)

SELECT T1.NName, T2.QTY FROM Goods T1 LEFT JOIN ( SELECT ... ) as T2 ON T1.ID = T2.ID
WHERE ...

сказанное мной справедливо для mssql7...



Страницы: 1 вся ветка

Текущий архив: 2002.10.31;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
7-101549
frum
2002-08-21 10:18
2002.10.31
ВЫДИЛЕНИЕ


3-101123
NG
2002-10-10 10:41
2002.10.31
Мастера, помогите


3-101068
Shadow
2002-10-13 15:59
2002.10.31
Как можно без особой мороки прочитать DBF-базу и сконвертировать


1-101351
Chlavik
2002-10-20 17:25
2002.10.31
Тормоза.....


3-101104
Dark Hunter
2002-10-09 17:33
2002.10.31
Текстовый поиск в MS SQL Server