Выберите из нескольких таблиц - PullRequest
0 голосов
/ 06 августа 2020

Я хотел бы получить данные из нескольких таблиц, но не могу получить ожидаемый результат. Буду признателен, если кто-нибудь сможет помочь с этим.

Table A:           Table B:                      Table C:

ReceiptID          ReceiptID   SkuID Qty         ReceiptID SkuID OrderNo
---------          ----------------------        -----------------------
A0001              A0001       9001   1          A0001     9001  DN999
A0002              A0001       9002   1          A0001     9002  DN999
                   A0001       9002   1          A0001     9002  DN999
                   A0001       9003   1          A0001     9003  DN999

Я пробовал это:

Select 
    A.ReceipID, B.SkuID, B.Qty, C.OrderNo 
From 
    A, B, C
Where
    A.ReceiptID = B.ReceiptID
    And A.ReceiptID = C.ReceiptID
    And B.SkuID = C.SkuID
    And A.ReceiptID = 'A0001'

Я получаю такой результат:

A0001 9001 1 DN999
A0001 9002 1 DN999
A0001 9002 1 DN999
A0001 9002 1 DN999
A0001 9002 1 DN999
A0001 9003 1 DN999

Мой ожидаемый результат должно быть:

A0001 9001 1 DN999
A0001 9002 1 DN999
A0001 9002 1 DN999
A0001 9003 1 DN999

Ответы [ 2 ]

1 голос
/ 06 августа 2020

У вашей модели данных есть некоторые проблемы, потому что, если вы ожидаете такого вывода, вам действительно следует отслеживать некоторые другие столбцы, которые сохраняют групповой порядок. При этом мы могли бы использовать ROW_NUMBER здесь, чтобы удовлетворить ваши требования:

WITH cteB AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ReceiptID, SkuID ORDER BY Qty) rn
    FROM TableB
),
cteC AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ReceiptID, SkuID ORDER BY OrderNo) rn
    FROM TableC
)

SELECT A.ReceiptID, B.SkuID, B.Qty, C.OrderNo 
FROM TableA a
INNER JOIN cteB b
    ON b.ReceiptID = a.ReceiptID
INNER JOIN cteC c
    ON c.ReceiptID = a.ReceiptID AND
       c.SkuID = b.SkuID AND
       c.rn = b.rn
WHERE
    a.ReceiptID = 'A0001';

screen capture from demo link below

Demo

Внимательно обратите внимание на logi c Я здесь использую. Я представляю в виде CTE фиктивный столбец rn в таблицах B и C, который используется для различения повторяющихся записей (в отношении получения и SKU). В идеале ваши исходные таблицы должны содержать такие столбцы, а не использовать приведенный выше объемный запрос.

0 голосов
/ 06 августа 2020

Вы можете попробовать это. Я не уверен, почему вы используете в своем примере таблицу A. Из вашего примера вы можете получить всю необходимую информацию из таблиц C и B.

SELECT
   C.ReceiptID, 
   C.SkuID, 
   B.Qty, 
   C.OrderNo 
FROM
   C
INNER JOIN
   B ON C.SkuID = B.SkuID AND C.ReceiptID = B.ReceiptID
-- next join not neccessary from your example, but for completion:
INNER JOIN
   A ON C.ReceiptID = A.ReceiptID
WHERE
   C.ReceiptID = 'A0001'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...