2016-01-19 6 views
0

Угадайте, есть похожие вопросы, и ответ может быть легко, но я не могу помочь себе, и поэтому я прошу вас, ребята.SQL select возвращает дополнительный результат

У меня некоторые данные в БД (Centura/Gupta SQLBase 7) нет Left/Right Присоединяйтесь возможно - явно не реализованы в SQLBase SQL

Вот мой выбор

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

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

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

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

+2

Вы пытались использовать инструкцию DISTINCT в SELECT? – Madhivanan

+0

, используя различные возможности, могут вызвать проблемы при дублировании записей.конечно, его и должно быть возможно добавить дубликаты, такие как artnr 1234 amount 1 artnr 1234 amount 1 (то, что должно возвращать artnr 1234, общая сумма равно 2) Кстати, с отличным он возвращает только 14 строк, потому что у некоторых artcle есть одно и то же имя, но разные artno. – Dwza

+0

Должен ли ты использовать эту странную БД, которая не имеет объединений? –

ответ

0

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

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'; 
+0

как я сказал ... я не могу использовать join Очевидно, что эта команда не реализована в этом sql. – Dwza

+1

Для записи SQLBase DOES полностью поддерживает явные соединения ANSI, как указано Matt и ранее. nclude ANSIJoinSyntax = 1 в [dbntsrv] sql.ini – GuptaSteve

0

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

ИСХОДНЫЙ: ВЫБОР 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;

p.s. SQLBase не является «странной» базой данных. Недавно выпущенный v12 будет превосходить SQLServer каждый раз с точки зрения производительности, производительности и общей стоимости владения. Пожалуйста, будьте лучше осведомлены о своих фактах перед трансляцией ерунды.

+0

Г-н Dwza: Если вы не можете использовать внутренние/внешние соединения в SQLBase - вы делаете это неправильно. SQLBase поддерживает все следующие форматы: Native или ANSI: SQLBase поддерживает следующие типы объединений: • Equijoins • Внешние соединения • Самостоятельно соединяется с • Неравновероятно Это ссылка на интерактивную справку SQLBase, которую вы, очевидно, могли бы использовать . http://support.guptatechnologies.com/supportwiki/index.php/SQLBase_12_Documentation – GuptaSteve

+0

Прежде всего, спасибо за эту информацию. Даже если ваш ответ был своего рода «пылающим». Как вы можете видеть, я сказал **, очевидно, ** не сказал, что это НЕ реализовано. Я также никогда не называл его «странной» базой данных !!! Прекрасно, что SB12 был выпущен, и это быстро ... Этот факт не имеет значения для моей проблемы. Мы используем версию 7 и да, я уверен, что у v12 есть хорошие улучшения! ... В любом случае ... я пробовал ваш синтаксис, и он по-прежнему упускает синтаксическую ошибку. Btw. проблема была вызвана неудачными данными в db. – Dwza

1

Синтаксис объединения ANSI для внешних/внутренних соединений был добавлен в v8.5 и далее (теперь до v12.1). Перед v8.5 вы можете использовать собственный синтаксис соединения Gupta Outer/Inner, например.

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 версии 8.5 onmwards является:

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

Как вы можете видеть в моем примере, я использую этот способ выбора allready. Когда я правильно помню, db равен 7.0.5. Но thx для этой информации. – Dwza

+0

Но почему вы ответили на мой вопрос 2 раза? :) – Dwza

+0

Ох. Я просто ответил. Не понял, что я уже сделал это. – GuptaSteve