Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.01 c
1-101339
Lony
2002-10-20 15:55
2002.10.31
WebBrowser


4-101574
disa
2002-09-19 12:33
2002.10.31
Управление приложениями


3-101163
nikolo
2002-10-11 12:20
2002.10.31
Как вычесть из запроса те строки, которые есть в другой таблице?


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


1-101272
shubin
2002-10-22 10:01
2002.10.31
День добрый!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский