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 каждый раз по производительности, занимаемой площади и общей стоимости владения. Пожалуйста, будьте более внимательны к своим фактам, прежде чем распространять ерунду.