Как проверить, существует ли тип строки в таблице - PullRequest
0 голосов
/ 26 июля 2010

Привет, у меня есть таблица заказов и таблица платежей, которые связаны order_num. Я хотел бы получить записи из таблицы заказов, в которых есть записи в таблице платежей PaymentType 'A', а также PaymentType 'B' и их суммы совпадают. Пример номера заказа 411 должен быть возвращен мне, только если у него есть как минимум два платежа, и один из них - тип платежа «A», а другой - тип платежа «b», а сумма для обоих - 45

.

Спасибо.

Ответы [ 5 ]

1 голос
/ 26 июля 2010

Как и состояние комментариев, очень мало информации, чтобы получить действительно точный ответ. Здесь идет возможное решение, по крайней мере, в базовой форме.

SELECT *
FROM Orders o
LEFT JOIN Payment p1 ON o.order_num = p1.order_num
LEFT JOIN Payment p2 ON o.order_num = p2.order_num
WHERE p1.Type = "A"
AND p2.Type = "B"
AND p1.Amount = p2.Amount
0 голосов
/ 26 июля 2010

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

select [columns]
  from ORDER O
 where exists (select null from PAYMENT PA, PAYMENT PB
                where PA.PAYMENT_TYPE = 'A'
                  and PB.PAYMENT_TYPE = 'B'
                  and PA.ORDER_NUM    = O.ORDER_NUM
                  and PB.ORDER_NUM    = O.ORDER_NUM
                  and PA.AMOUNT       = PB.AMOUNT)
0 голосов
/ 26 июля 2010

Делая (надеюсь) разумные предположения относительно имен таблиц, столбцов и т. Д., Как насчет ...

SELECT *
    FROM ORDER_TABLE
    WHERE EXISTS (SELECT *
                      FROM PAYMENT_TABLE
                      WHERE PAYMENT_TYPE         = 'A'               AND
                            PAYMENT_TABLE.ORDER  = ORDER_TABLE.ORDER AND
                            PAYMENT_TABLE.AMOUNT = ORDER_TABLE.AMOUNT) AND
          EXISTS (SELECT *
                      FROM PAYMENT_TABLE
                      WHERE PAYMENT_TYPE         = 'B'               AND
                            PAYMENT_TABLE.ORDER  = ORDER_TABLE.ORDER AND
                            PAYMENT_TABLE.AMOUNT = ORDER_TABLE.AMOUNT);
0 голосов
/ 26 июля 2010

Как насчет этого:

SELECT      o.OrderID,
            o.Amount
FROM        Order AS o
INNER JOIN  Payment AS pA ON pA.OrderID = o.OrderID AND pA.PaymentType = 'A'
INNER JOIN  Payment AS pB ON pB.OrderID = o.OrderID AND pB.PaymentType = 'B'
WHERE       pA.Amount = pB.Amount
GROUP BY    o.OrderID,
            o.Amount
0 голосов
/ 26 июля 2010

До тех пор, пока вы можете гарантировать, что имеется не более одной строки A и B:

SELECT
     <columns here>
FROM
     Orders O
INNER JOIN Payments PA ON
     PA.order_number = O.order_number AND
     PA.payment_type = 'A'
INNER JOIN Payments PB ON
     PB.order_number = O.order_number AND
     PB.payment_type = 'B'
WHERE
     PA.amount = PB.amount
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...