2013-09-27 1 views
0

У меня есть вопрос. Как я могу написать этот SQLНомер заказа, который dosnt существует в другой таблице

Первая таблица

  1. Имя: ORDER_TABLE
  2. Колонка: ORDER_NUMBER, Contract_number, vendor_number

второй таблице

  1. Имя : ПРОТИВ TRACT_TABLE
  2. Колонка: Contract_number, vendor_number

У меня есть один contract_number = '1234', который содержит в CONTRACT_TABLE, но я хочу проверить ли это contract_number есть порядок. Я хочу, чтобы получить счет этого Contract_number который оленья кожа у ORDER_NUMBER в ORDER_TABLE

SELECT ct.VENDOR_NUMBER, ct.CONTRACT_NUMBER, ot.ORDER_NUMBER 
FROM CONTRACT_TABLE ct, 
    ORDER_TABLE ot 
WHERE ct.vendor_number = ot.vendor_number 
+0

так что у вас есть SQL, а? –

ответ

1

Предполагая, что вы хотите, чтобы обнаружить все Contract_number в CONTRACT_TABLE, который не выходит в ORDER_TABLE (не ясно из вашего описания) здесь один Exemple ofsql :

select Contract_number from CONTRACT_TABLE 
minus select distinct Contract_number from ORDER_TABLE 
+0

его лучшее для меня :) спасибо U – Przemek

+0

не беспокоится. Просто убедитесь, что Contract_number является либо первичным ключом, либо индексированным столбцом в обеих таблицах, чтобы избежать каких-либо проблем с производительностью. – Farid

1
SELECT 
    Contract_Number 
FROM 
    Contract_Table 
WHERE 
    NOT EXISTS 
    (SELECT 
     NULL 
    FROM 
     Order_Table 
    WHERE 
     Contract_Table.Order_Number = Order_Table.Order_Number) 
1

Вы должны использовать LEFT JOIN:

SELECT ct.VENDOR_NUMBER, ct.CONTRACT_NUMBER, ot.ORDER_NUMBER 
FROM CONTRACT_TABLE ct 
    LEFT JOIN ORDER_TABLE ot 
     ON ct.vendor_number = ot.vendor_number 

Затем, если нет соответствующей записи в ORDER_TABLE, вы все равно получите данные о контракте, но столбец ORDER_NUMBER вернет NULL.

Если вы хотите только вернуть контракты там, где нет порядка, то вы можете добавить где положение для фильтрации:

WHERE ot.ORDER_NUMBER IS NULL 

Это одна из причин, почему это хорошая идея, чтобы переключиться на более новый ANSI 92 JOIN вместо старого ANSI 89 неявного синтаксиса соединения, который вы используете. This article, хотя в основном о SQL-Server перечислены некоторые веские причины для переключения на новый синтаксис объединения стилей.

Примечание - Есть некоторые редкие случаи, когда Oracle будет оптимизировать неявное присоединиться лучше, чем явное соединение, но это исключение из правил, почти все время эти два метода будут генерировать тот же план

+1

Btw: Oracle рекомендует в руководстве использовать явные 'JOIN' специально для внешних соединений (и прекратить использование оператора '(+)') –

+0

Ссылка на часть в руководстве @a_horse_with_no_name ссылается на здесь: http: //docs.oracle.com/cd/E11882_01/server.112/e26088/queries006.htm#sthref2257 – GarethD

+0

thank U :) Его OK – Przemek

0
DECLARE @ORDER_TABLE 
TABLE (ORDER_NUMBER INT, CONTRACT_NUMBER INT ,VENDOR_NUMBER INT) 

DECLARE @CONTRACT_TABLE TABLE 
(CONTRACT_NUMBER INT , VENDOR_NUMBER INT) 


SELECT 
    C.CONTRACT_NUMBER , 
    COUNT(ORDER_NUMBER) AS ORDER_SCORE 
FROM 
    @ORDER_TABLE O 
RIGHT OUTER JOIN 
    @CONTRACT_TABLE C ON C.CONTRACT_NUMBER = O.CONTRACT_NUMBER 
GROUP BY C.CONTRACT_NUMBER 
HAVING COUNT(O.ORDER_NUMBER)= 0 
+1

Это недопустимо SQL для Oracle –

+0

* ЭТО ДЛЯ MSSQL SERVER. СПАСИБО. –

+1

Исправить (и только SQL Server ** **).Итак, почему вы отправили это на вопрос, связанный с Oracle? –

Смежные вопросы