SQL select возвращает дополнительный результат

Думаю, есть похожие вопросы, и ответ может быть легким, но я не могу помочь себе, и поэтому я спрашиваю вас, ребята.

У меня есть некоторые данные в БД (Centura/Gupta SQLBase 7) нет левого / правого соединения возможно - очевидно, не реализовано в sqlbase sql

Вот мой выбор

SELECT 
    I.IARTNR, 
    L.ARTNAME 
FROM 
    INVENTUR I,
    LAGER L 
WHERE 
    L.ARTSTR = I.IARTNR 
AND
    I.AB = '2015-81';

возвращает 20 строк, а не 18 как указано.

INVENTUR строки с AB установлен в 2015-81 18 и в LAGER имеются <3000 строк. Что я пытаюсь сделать, это выбрать все статьи фон INVENTUR и добавьте название статьи, написанное в LAGER,

Что не так с моим выбором? Запуск этого "таинственного" с 3-х дней.

3 ответа

Синтаксис ANSI-соединений для внешних / внутренних соединений был добавлен в версии 8.5 и выше (теперь до версии 12.1). До версии 8.5 вы можете использовать собственный синтаксис Gupta Outer / Inner join, например:

SELECT t1.col1,t2.col1,t1.col2,t2.col2
FROM t1,t2
WHERE t1.col1 = t2.col1(+)
AND   t1.col2 = t2.col2(+)

В следующем примере перечислены имена клиентов и их номера заказов, включая клиентов, которые не делали заказов:

SELECT CUSTOMER.CUSTNO,NAME
FROM CUSTOMER,ORDERS
WHERE CUSTOMER.CUSTNO = ORDERS.CUSTNO(*)

Тот же запрос с использованием синтаксиса ANSI в SQLBase v8.5 и далее:

SELECT CUSTOMER.CUSTNO,NAME 
FROM CUSTOMER LEFT OUTER JOIN ORDERS ON CUSTOMER.CUSTNO = ORDERS.CUSTNO

Используйте явные объединения.

SELECT I.IARTNR, L.ARTNAME 
FROM INVENTUR I
INNER JOIN LAGER L ON I.IARTNR = L.ARTSTR
WHERE I.AB = '2015-81';

И если это необходимо DISTINCT,

SELECT DISTINCT I.IARTNR, L.ARTNAME 
FROM INVENTUR I
INNER JOIN LAGER L ON I.IARTNR = L.ARTSTR
WHERE I.AB = '2015-81';

Конечно, SQLBase имеет внутренние / внешние соединения! Либо собственный синтаксис (с использованием (+)), либо ANSI .
Вот синтаксис:

NATIVE: ВЫБЕРИТЕ t1.col1, t2.col1, t1.col2, t2.col2 ОТ t1, t2 ГДЕ t1.col1 = t2.col1 (+) И t1.col2 = t2.col2 (+);

ANSI: ВЫБЕРИТЕ t1.col1, t2.col1, t1.col2, t2.col2 ИЗ t2 ПРАВАЯ ВНЕШНЯЯ СОЕДИНЕНИЕ t1 ВКЛ t1.col1 = t2.col1 И t1.col2 = t2.col2;

ps SQLBase не является "странной" базой данных. Недавно выпущенная версия 12 будет превосходить SQLServer каждый раз по производительности, занимаемой площади и общей стоимости владения. Пожалуйста, будьте более внимательны к своим фактам, прежде чем распространять ерунду.

Другие вопросы по тегам