Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.012 c
3-101153
_pavel_
2002-10-10 18:36
2002.10.31
Apollo VCL + Apollo Server


4-101579
Zion
2002-09-16 15:09
2002.10.31
FindFirst и все все все =)


14-101500
RussianSlimer
2002-10-12 00:19
2002.10.31
Сети


14-101448
Cobalt
2002-10-04 12:20
2002.10.31
Настройка компа с двумя сетевухами


3-101170
Hlor
2002-10-11 13:40
2002.10.31
Как просуммировать поле




   Наверх