2015-02-02 1 views
1

У меня есть такие таблицы.Внутренние соединения с условием have не дают выход

PollingDivision

 pdID pdName 
     1 Homagama 
     2 Maharagama 
     3 Kesbewa 

PollingBooth

 PBID PBName pdivID 
     1  HP  1 
     2  HD  2 

PollingBoothElection

 pbID elecID numofEO 
     1   1  3 

PollingBoothElectionOfficial

 pbID elecid eOfficialID 
     1  1  1 

Я пытаюсь получить имена пула буферов из кабины для голосования, в которой выделенное должностное лицо выборов (количество столбцов eOfficialID для определенного элемента и pbID в таблице PollingBoothElectionOfficial) меньше числа официальных официальных номеров выборов в PollingBoothElection Table опросом Отдел.

Вот что я пробовал.

SELECT 
    PB.PBName, COUNT(PBEO.eOfficialID) AS EOCount 
FROM 
    PollingBoothElection PBE 
INNER JOIN 
    PollingBooth PB ON PBE.pbID = PB.PBID 
INNER JOIN 
    PollingDivision PD ON PB.pdivID = PD.pdID 
INNER JOIN 
    PollingBoothElectionOfficial PBEO ON PBE.elecID = PBEO.elecID 
             AND PBE.pbID = PBEO.pboothID 
WHERE 
    PBE.elecID = 1 
    AND PD.pdName = 'Homagama' 
GROUP BY 
    PB.PBName, PBE.numOfEO 
HAVING 
    COUNT(PBEO.eOfficialID) < (PBE.numOfEO); 

Хотя у меня есть данные в таблице, это не дает мне результата. Что я здесь делаю неправильно?

Ожидаемый результат

  pbName Count 
      HP  1 

Поскольку для опроса Booth HP число ЕО 3, но в PollingBoothElectionOfficial таблице есть только одна запись для pbid1 elecid 1, так что граф меньше, чем число ЭОС (numOfEO).

+1

Вы можете оставить ожидаемый результат? –

+0

Ваш запрос возвращает это. –

+0

@wewesthemenace NO – chathwind

ответ

0

Я положу его здесь, так как я выйду за пределы комментария.

Ваш запрос результаты, что вы ожидали:

ОБРАЗЕЦ ДАННЫХ

CREATE TABLE PollingDivision(
    pdID INT, 
    pdName VARCHAR(20) 
) 
CREATE TABLE PollingBooth(
    PBID INT, 
    PBName VARCHAR(20), 
    pdivID INT 
) 
CREATE TABLE PollingBoothElection(
    pbID INT, 
    elecID INT, 
    numofEO INT 
) 
CREATE TABLE PollingBoothElectionOfficial(
    pbID  INT, 
    electID  INT, 
    eOfficialID INT 
) 
INSERT INTO PollingDivision VALUES (1, 'Homagama'), (2, 'Maharagama'), (3, 'Kesbewa'); 
INSERT INTO PollingBooth VALUES (1, 'HP', 1), (2, 'HD', 2); 
INSERT INTO PollingBoothElection VALUES (1, 1, 3); 
INSERT INTO PollingBoothElectionOfficial VALUES (1, 1, 1); 

Ваш (отформатированные) запрос:

SELECT 
    PB.PBName, 
    COUNT(PBEO.eOfficialID) AS EOCount 
FROM PollingBoothElection PBE 
INNER JOIN PollingBooth PB 
    ON PBE.pbID = PB.PBID 
INNER JOIN PollingDivision PD 
    ON PB.pdivID = PD.pdID 
INNER JOIN PollingBoothElectionOfficial PBEO 
    ON PBE.elecID = PBEO.electID --replaced PBEO.elecID with PBEO.electID 
    AND PBE.pbID = PBEO.pbID -- replaced PBEO.pboothID with PBEO.pbID 
WHERE 
    PBE.elecID = 1 
    AND PD.pdName = 'Homagama' 
GROUP BY PB.PBName, PBE.numOfEO 
HAVING COUNT(PBEO.eOfficialID) < (PBE.numOfEO); 

РЕЗУЛЬТАТ

PBName    EOCount 
-------------------- ----------- 
HP     1 
+0

Это тот же вопрос? – chathwind

+0

Да, с заменами, чтобы избежать синтаксической ошибки. –

+0

мой pollingBoothElectionОфициальная таблица почти пуста, но запрос не выбирает какую-либо стенд-подборку в PollingBoothElection с помощью elecid 1? Как вы думаете, в чем причина? – chathwind

0

Это должно помочь в результате к тому, что вам нужно:

Select PBName, SUM(eOfficialIDCount)[Count] 
from (Select pbID, elecID, Count(Distinct eOfficialID)eOfficialIDCount 
     from PollingBoothElectionOfficial Group by pbID, electID)A 
Left Join (Select pbID, elecID, numofEO from PollingBoothElection)B On B.pbID+b.elecID = A.pbID+a.elecID 
Left Join (Select pbID, PBName from PollingBooth)C On C.pbID = A.pbID 
Where eOfficialIDCount < numofEO Group by PBName