2014-11-30 1 views
0

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

В таблице «Доказательства» меня беспокоит только столбец «Хэш» и столбец «Подозреваемый». Столбцы Suspect Table представляют интерес как SuspectID, SuspectFirstName, SuspectLastName и Suspect.SuspectState.

Я хочу установить связь между Evidence.Hash и Suspect.SuspectID. Я хочу иметь возможность отображать всех подозреваемых, связанных с конкретным файлом доказательств. то есть:

«Файл [хеш файла] связан с Suspect1, Suspect2 и Suspect3» «Файл [хеш file2] подключен к Suspect1 и Suspect2»

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

Вот что у меня есть. Ничего не сработало полностью:

Это печатает хэши файлов, которые имеют более одного подозреваемого идентификатора, связанного с ними. Мне нужно также включить имя подозреваемого и состояние.

SELECT Evidence.Hash 
FROM Evidence 
GROUP BY Evidence.Hash 
HAVING COUNT(Evidence.SuspectID) > 2 

Это возвращает все хэши со всеми подозреваемыми, отсортированными по хешу. Это нормально, но я бы предпочел, чтобы они просто не указали.

SELECT Evidence.Hash, Evidence.SuspectID, SuspectFirstName, Suspect.SuspectLastName 
FROM Evidence 
INNER JOIN Suspect 
ON Evidence.SuspectID=Suspect.SuspectID 
ORDER BY Evidence.Hash 

Я хотел бы объединить 2 запроса. Я попробовал следующее, но теперь ничего не печатается на экране.

SELECT Evidence.Hash, Evidence.SuspectID, SuspectFirstName, Suspect.SuspectLastName 
AS FileHash 
FROM Evidence 
INNER JOIN Suspect 
ON Suspect.SuspectID = Evidence.SuspectID 
GROUP BY Evidence.Hash,Evidence.SuspectID, SuspectFirstName, Suspect.SuspectLastName 
HAVING Count(Evidence.SuspectID)> 1 

Если кто-то может помочь мне и показать мне, как получить хэши, которые связаны с более чем 1 suspectID, я был бы признателен.

+0

Вы, вероятно, получите никаких результатов из-за ваш иметь заявление. Получаете ли вы какие-либо результаты без этого? – Hatsjoem

ответ

0

Не проверено, но должно быть выполнено.

SELECT 
    Evidence.Hash AS FileHash, 
    Evidence.SuspectID, 
    Suspect.SuspectFirstName, 
    Suspect.SuspectLastName 
FROM 
    Evidence 
    INNER JOIN Suspect ON Suspect.SuspectID = Evidence.SuspectID 
GROUP BY 
    Evidence.SuspectID 
HAVING 
    COUNT(Evidence.SuspectID)> 1 

UPDATE: Если я правильно понял вопрос, колонка GROUP должна быть Suspect.SuspectID

GROUP BY 
    Suspect.SuspectID 
HAVING 
    COUNT(Suspect.SuspectID)> 1 
0

Вы должны

  • получить hashs, для которых Есть несколько подозреваемых, и затем
  • присоединитесь к деталям.

Попробуйте

SELECT 
    MS.hash FileHash 
    , E.SuspectID 
    , S.SuspectFirstName 
    , S.SuspectLastName 
FROM (
    SELECT 
    E.hash 
    FROM Evidence E 
    JOIN Suspect S 
    ON E.SuspectID = S.id 
    GROUP BY E.hash 
    HAVING COUNT(E.SuspectID) > 1) MS 
JOIN Evidence E 
    ON MS.hash = E.hash 
JOIN Suspect S 
    ON E.SuspectID = S.id 
; 

Там могут быть альтернативы - но не может проверить их прямо сейчас.

0

Используйте window function найти Evidence.Hash, который присутствует более чем один раз в Evidence таблице

;with cte as 
(
SELECT row_number() over (partition by Hash order by SuspectID) Rn, * 
FROM Evidence 
) 
select * from cte where rn>1 

Теперь соедините результат с Suspect столом

;with cte as 
(
SELECT row_number() over (partition by Hash order by SuspectID) Rn, * 
FROM Evidence 
) 
select Evidence.Hash, Evidence.SuspectID, SuspectFirstName, Suspect.SuspectLastName 
    from cte Evidence 
    join Suspect 
    on Evidence.SuspectID=Suspect.SuspectID 
where rn>1 
Смежные вопросы