SQL найти элементы, готовые из заказа - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть две таблицы: одна ORDERS, а другая ORDERITEM

Таблица ORDERS выглядит следующим образом:

ORDERNO 
ORDERDATE
ORDERREADYDATE
CUSTOMERNO

Таблица ORDERITEMS выглядит следующим образом:

ORDERNO 
ORDERDATE
QTY
ITEMNO

У меня есть запись заказа:

12335
11/04/2018
11/06/2018
9999999

12336
11/04/2018
11/06/2018
9999998

12337
11/04/2018
11/06/2018
9999997

12345
11/05/2018
11/07/2018
9999999

12346
11/05/2018
11/07/2018
9999998

12347
11/05/2018
11/07/2018
9999997

И элементы заказа:

12335
11/04/2018
5
678    

12335.1
11/04/2018
11
587

12335.2
11/04/2018
3
554

12336
11/04/2018
5
678    

12336.1
11/04/2018
11
587

12336.2
11/04/2018
3
554

12345
11/05/2018
5
678    

12345.1
11/05/2018
11
587

12345.2
11/05/2018
3
554

12346
11/05/2018
5
678    

12346.1
11/05/2018
11
587

12346.2
11/05/2018
3
554

В готовую дату я хотел бы найти все пункты, которые не имеют точки в счете.

Я пробовал это, но он дает мне старые заказы:

SELECT
  i.orderno,
  i.orderdate,
  d.orderno,
  d.orderdate,
  d.itemno
FROM
  ORDERS i,
  ORDERITEM d
WHERE
      i.ORDERREADYDATE = '2018-11-07'
  AND d.orderdate = i.orderdate
  AND d.orderno NOT LIKE '%.%'

Вот код для воспроизведения проблемы:

TRY DROP TABLE #ORDERS; CATCH ALL END TRY;
TRY DROP TABLE #ORDERITEM; CATCH ALL END TRY;

CREATE TABLE
  #ORDERS
(
  ORDERNO NVARCHAR(10), 
  ORDERDATE DATE,
  ORDERREADYDATE DATE,
  CUSTOMERNO INTEGER
);

CREATE TABLE
  #ORDERITEM
(
  ORDERNO NVARCHAR(10), 
  ORDERDATE DATE,
  QTY INTEGER,
  ITEMNO INTEGER,
);

INSERT INTO
  #ORDERS
SELECT
  '12335',
  '2018-11-04',
  '2018-11-06',
  9999999
FROM system.iota
UNION SELECT
  '12336',
  '2018-11-04',
  '2018-11-06',
  9999998
FROM system.iota
UNION SELECT
  '12337',
  '2018-11-04',
  '2018-11-06',
  9999997
FROM system.iota
UNION SELECT
  '12345',
  '2018-11-05',
  '2018-11-07',
  9999999
FROM system.iota
UNION SELECT
  '12346',
  '2018-11-05',
  '2018-11-07',
  9999998
FROM system.iota
UNION SELECT
  '12347',
  '2018-11-05',
  '2018-11-07',
  9999997
FROM system.iota;

INSERT INTO
  #ORDERITEM
SELECT
  '12335',
  '2018-11-04',
  5,
  678
FROM system.iota
UNION SELECT
  '12335.1',
  '2018-11-04',
  11,
  587
FROM system.iota
UNION SELECT
  '12335.2',
  '2018-11-04',
  3,
  554
FROM system.iota
UNION SELECT
  '12336',
  '2018-11-04',
  5,
  678    
FROM system.iota
UNION SELECT
  '12336.1',
  '2018-11-04',
  11,
  587
FROM system.iota
UNION SELECT
  '12336.2',
  '2018-11-04',
  3,
  554
FROM system.iota
UNION SELECT
  '12345',
  '2018-11-05',
  5,
  678    
FROM system.iota
UNION SELECT
  '12345.1',
  '2018-11-05',
  11,
  587
FROM system.iota
UNION SELECT
  '12345.2',
  '2018-11-05',
  3,
  554
FROM system.iota
UNION SELECT
  '12346',
  '2018-11-05',
  5,
  678    
FROM system.iota
UNION SELECT
  '12346.1',
  '2018-11-05',
  11,
  587
FROM system.iota
UNION SELECT
  '12346.2',
  '2018-11-05',
  3,
  554
FROM system.iota
;

SELECT
  i.orderno,
  i.orderdate,
  d.orderno,
  d.orderdate,
  d.itemno
FROM
  #ORDERS i,
  #ORDERITEM d
WHERE
      i.ORDERREADYDATE = '2018-11-07'
  AND d.orderdate = i.orderdate
  AND d.orderno NOT LIKE '%.%'
;

Этот SQL работает вечно, если я удаляю d.orderno, НЕ КАК "%.%", Он завершается, но я получаю те же 20 повторяющихся i.orderno с diffrent d.orderno. Таблица ORDERITEM насчитывает более 7 миллионов записей, растущих с 10K каждый день.

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Я нашел способ, это вернуть правильный результат.

Select d.orderno, d.orderdate from ORDERITEMS d
where
d.orderno NOT LIKE '%.%' and d.orderno in 
(Select i.orderdate ORDERS i where i.orderreadydate='2018-11-07)
0 голосов
/ 08 ноября 2018

Я рекомендую не использовать старый стиль синтаксиса соединения , но независимо от того, что вы, кажется, пропускаете условие join: i.orderno = d.orderno

Select 
    i.orderno, 
    i.orderdate, 
    d.orderno, 
    d.orderdate, 
    d.itemno 
from
    ORDERS i
join
    ORDERITEM d
on 
    i.orderno = d.orderno
    and d.orderdate = i.orderdate
    and d.orderno NOT LIKE '%.%'
where 
    i.ORDERREADYDATE='2018-11-07' 

Вот тот же запрос со старым синтаксисом соединения:

Select 
    i.orderno, 
    i.orderdate, 
    d.orderno, 
    d.orderdate, 
    d.itemno 
from
    #ORDERS i,
    #ORDERITEM d
where 
    i.orderno = d.orderno
    and d.orderdate = i.orderdate
    and d.orderno NOT LIKE '%.%'
    and i.ORDERREADYDATE='2018-11-07'
...