Включить подвыбор, только если есть один результат, используя tsql - PullRequest
1 голос
/ 05 ноября 2010

У нас есть счет-фактура, сведения о счете-фактуре и таблица заказов, и таблицы связаны строками сведений о счете-фактуре, поскольку данные счета-фактуры сгруппированы по дате поставки, поэтому счет часто покрывает несколько номеров заказов.

ТеперьЯ хотел бы создать представление, в котором отображался бы номер заказа, если в счете-фактуре используется только один заказ, с использованием некоторого подвыбора.

Я пришел с этим, но он по-прежнему генерирует сообщение об ошибкечто подзапрос возвращает более одного результата

SELECT Invoice.Id, Invoice.TotalAmount, 
(SELECT DISTINCT OrderId  FROM InvoiceDetail 
WHERE InvoiceDetail.InvoiceId = Invoice.Id
GROUP BY OrderId HAVING COUNT(DISTICT OrderId) = 1) AS OrderId 
FROM Invoice

Есть идеи, как заставить это работать?

Ответы [ 4 ]

1 голос
/ 05 ноября 2010

Как насчет:

SELECT 
  Invoice.Id,
  Invoice.TotalAmount,
  OneOrder.OrderId
FROM 
  Invoice
  LEFT JOIN (
    SELECT   InvoiceId, MIN(OrderId) OrderId
    FROM     InvoiceDetail 
    GROUP BY InvoiceId
    HAVING   COUNT(DISTINCT OrderId) = 1
  ) OneOrder ON OneOrder.InvoiceId = Invoice.Id
1 голос
/ 05 ноября 2010

Проверено правильно:

SELECT Id, TotalAmount, OrderInfo.OrderId 
  FROM Invoice 
  JOIN
    (
      SELECT InvoiceId, OrderId 
        FROM InvoiceDetail 
        JOIN Invoice  
          ON InvoiceDetail.InvoiceId = Invoice.Id  
       GROUP BY InvoiceId, OrderId
      HAVING COUNT(OrderId)=1
    ) AS OrderInfo
    ON Invoice.Id=OrderInfo.InvoiceId

Обратите внимание на отсутствие DISTINCT в предложении HAVING, что неверно (это приведет к тому, что несколько идентификаторов заказа будут считаться одним, нарушая ожидаемое поведение)

0 голосов
/ 05 ноября 2010

Изменение GROUP BY OrderId в GROUP BY InvoiceDetail.InvoiceId

0 голосов
/ 05 ноября 2010

Ваша проблема может быть просто опечатка в предложении HAVING. См. DISTICT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...