Форум: "Базы";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
ВнизПомогите пожалйста с запросом Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c