2013-07-25 4 views
0

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

Проекты PK -> ProID

Вехи в сочетании PK -> ProID и MstNo

По некоторым причинам я не могу используйте ProID в качестве внешнего ключа, чтобы связать эти две таблицы вместе (ограничение FOREIGN KEY). Однако мне нужно написать запрос, в котором будут отображаться подробные сведения обо всех таблицах таблиц проектов, а также ряд этапов для каждого проекта. Могу ли я использовать внутреннее соединение для достижения этого? Я плохо разбираюсь в написании SQL-запросов.

+0

Какую ошибку/проблему вы столкнулись, когда пытались настроить ограничение внешнего ключа? –

+0

На ваш вопрос «Могу ли я использовать внутреннее соединение для достижения чего-то?» - это «ДА». – Romesh

ответ

2

Попробуйте этот вариант -

SELECT 
     P.* 
    , cnt = ISNULL(M.cnt, 0) 
FROM dbo.Projects P 
LEFT JOIN (
    SELECT ProID, cnt = COUNT(1) 
    FROM dbo.Milestones 
    GROUP BY ProID 
) M ON M.ProID = P.ProID 
0

Да, вы можете. inner join сопоставлять данные из одной таблицы с другой в объявленном состоянии.

select * from Projects inner join Milestones on Projects.ProId = Milestones.ProID.

Этот запрос будет считывать все данные из таблицы Projects и сопоставлять ему данные от Milestones.

В результате у вас будут объекты, имеющие ProId в обеих таблицах.

0
SELECT P.ProID , 
     COUNT(M.*) 
FROM Projects P 
     LEFT JOIN Milestones M 
      ON M.ProID = P.ProID 
GROUP BY P.ProID 
0

Если бы я получил структуру таблицы, вы должны написать что-то вроде

SELECT 
    ProID, 
    count(*) as MstNo 
FROM projects 
LEFT JOIN milestones ON projects.ProID=milestones.ProID 
GROUP BY ProID 

еще лучше

SELECT 
    ProID, 
    sum(
    CASE WHEN milestones.ProID is null THEN 0 ELSE 1 END 
) as MstNo 
FROM projects 
LEFT JOIN milestones ON projects.ProID=milestones.ProID 
GROUP BY ProID 

Таким образом, вы будете иметь счетчик 0 для проектов без вех еще

Смежные вопросы