2015-05-14 5 views
-2

У меня есть 4 таблицы:Показать все поля независимо, если общая равна нулю

  • RequestPossibility с полями Id, RequestID, Text
  • RequestCategory с полями Текст, RequestID
  • RequestOutcome с полями Id, RequestID
  • Запрос в поле RequestId

Вот мой запрос, который ТОЛЬКО возвращает результаты, когда «Всего» не равно 0. Я хочу t o вернуть все результаты для типа «Текст». Вот мой вопрос:

SELECT 
       MAX(RC.Text) AS Text, 
       MAX(RP.Text) AS TextPossibility, 
       COUNT(*) AS Total 
FROM Request R 
       JOIN RequestOutcome RO ON R.RequestId = RO.Id 
       JOIN RequestPossibility RP ON RO.Id = RP.Id 
       JOIN RequestCategory RC ON RP.RequestId = RC.RequestId 
GROUP BY RP.Id 
ORDER BY 1, 2 ASC 
+0

Эй, я уже пробовал - и это было даже не полностью правильный ответ в любом случае. Так. Укуси меня. – jenjerstar

+0

Нет необходимости в таком языке. Ваш принятый ответ используется влево, поэтому мой комментарий правильный. –

+0

Я играл с правым и левым соединением, и да, я мог бы сказать это в моем первоначальном вопросе. Однако это было * не * полное решение. Мне действительно нужно было сосчитать конкретную область, как сказал Аллен Май, помимо использования комбинации левого и правого соединений, как указано в моем последнем сообщении. Это единственный способ заставить это работать. – jenjerstar

ответ

2

Если посчитать конкретное поле и использовать LEFT JOIN вы можете решить эту проблему.

SELECT 
      MAX(RC.Text) AS Text, 
      MAX(RP.Text) AS TextPossibility, 
      COUNT(R.RequestId) AS Total 
FROM Request R 
      LEFT JOIN RequestOutcome RO ON R.RequestId = RO.Id 
      JOIN RequestPossibility RP ON RO.Id = RP.Id 
      JOIN RequestCategory RC ON RP.RequestId = RC.RequestId 
GROUP BY RP.Id 
ORDER BY 1, 2 ASC 
+0

Я тоже это пробовал, даже попробовал разные поля в функции COUNT(). Я до сих пор не могу заставить его работать. Спасибо за все ваши быстрые ответы. Кажется, это должно быть намного проще, чем есть. Любые другие предложения более чем приветствуются. – jenjerstar

+0

@ Allen May, я должен это вам. Я смог решить это с помощью нескольких настроек вашего предложения Count(). Я буду отмечать вас как принятый ответ. Спасибо, миллион, я не мог бы прийти к этому без тебя! – jenjerstar

+0

Рад помочь. Позвольте мне, если вы снова застрянете. –

0

Так работает SQL. Если в запросе нет строк (COUNT(*) == 0), вы не получите никаких результатов.

0

Использование LEFT JOIN:

SELECT 
       MAX(RC.Text) AS Text, 
       MAX(RP.Text) AS TextPossibility, 
       COUNT(*) AS Total 
FROM Request R 
       LEFT JOIN RequestOutcome RO ON R.RequestId = RO.Id 
       LEFT JOIN RequestPossibility RP ON RO.Id = RP.Id 
       LEFT JOIN RequestCategory RC ON RP.RequestId = RC.RequestId 
GROUP BY RP.Id 
ORDER BY 1, 2 ASC 

Edit # 1:

Это не было указано в вашем вопросе: "мне нужны все результаты RequestPossibility.Text вернуться независимо от любого другого таблицы ". Проверьте новый запрос:

SELECT 
       RP.Text AS TextPossibility, 
       MAX(RC.Text) AS Text, 
       COUNT(*) AS Total 
FROM RequestPossibility RP 
       LEFT JOIN Request R ON R.RequestId = RP.RequestId 
       LEFT JOIN RequestOutcome RO ON RP.RequestId = RO.Id 
       LEFT JOIN RequestCategory RC ON RP.RequestId = RC.RequestId 
GROUP BY RP.Text 
ORDER BY 1, 2 ASC 
+0

Хм .. LEFT JOIN, похоже, не работает. Мне нужны ВСЕ результаты из RequestPossibility.Text для возврата независимо от любой другой таблицы. Я думаю, что запрос просто должен быть каким-то образом перестроен, я просто не знаю, как это сделать. – jenjerstar

0

При использовании соединений влево/вправо порядок таблиц имеет значение. Попробуйте это:

SELECT MAX(RC.Text) AS Text, 
MAX(RP.Text) AS TextPossibility, 
COUNT(*) AS Total 
FROM RequestPossibility RP 
LEFT JOIN Request R ON RP.id = R.RequestId 
LEFT JOIN RequestOutcome RO ON R.RequestId = RO.Id 
LEFT JOIN RequestCategory RC ON RP.RequestId = RC.RequestId 
GROUP BY RP.Id 
ORDER BY 1, 2 ASC 
+0

Зачем? RP - это псевдоним первой таблицы. –

+0

О, вы переключили заказ - извините – Paparazzi

+0

Да, это своего рода дырочная точка этого ответа ... –

0

Вам нужно слева, и вы должны группе R.RequestId (самый левый)

SELECT R.RequestId, 
     MAX(RC.Text) AS Text, 
     MAX(RP.Text) AS TextPossibility, 
     COUNT(*) AS Total 
FROM Request R 
Left JOIN RequestOutcome RO 
    ON R.RequestId = RO.Id 
left JOIN RequestPossibility RP 
    ON R.RequestId = RP.Id 
left JOIN RequestCategory RC 
    ON RP.RequestId = RC.RequestId 
GROUP BY R.RequestId 
ORDER BY 2, 3 ASC 

Странно, что вы на флопе, чтобы RequestID в последний присоединиться
Это RequestId не привязано к R.RequestId

Вы хотите ВСЕ результаты от RequestPossibility.Text, тогда базовый запрос отключен
Непонятно мне, что вы действительно хотите

SELECT RP.Text AS TextPossibility 
      MAX(RC.Text) AS Text, 
      COUNT(*) AS Total 
    RequestPossibility RP   
    left join Request R 
     ON R.RequestId = RP.Id 
    Left JOIN RequestOutcome RO 
     ON RP.Id = RO.Id 
    left JOIN RequestCategory RC 
     ON RP.RequestId = RC.RequestId 
    GROUP BY RP.Text 
    ORDER BY 1, 2 ASC 
+0

Пытаясь пройти мой окончательный ответ .. Извините за задержку – jenjerstar

-1
SELECT 
       MAX(RC.Text) AS Text 
,    MAX(RP.Text) AS TextPossibility 
,    COUNT(R.RequestId) AS Total 
FROM Request R 
       LEFT JOIN RequestOutcome RO ON R.RequestId = RO.RequestId 
       RIGHT OUTER JOIN RequestPossibility RP ON RO.Id = RP.Id 
       RIGHT OUTER JOIN RequestCategory RC ON RP.RequestId = RC.RequestId 
GROUP BY RP.Id 
ORDER BY 1, 2 ASC 
Смежные вопросы