Возврат SQL только там, где более одного объединения - PullRequest
2 голосов
/ 08 июля 2010

Не знаю, как спросить об этом, потому что я немного новичок в базе данных,

Я хочу сделать следующее:

table tb_Company
table tb_Division

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

SELECT   dbo.tb_Company.CompanyID, dbo.tb_Company.CompanyName, 
dbo.tb_Division.DivisionName FROM dbo.tb_Company INNER JOIN dbo.tb_Division ON 
dbo.tb_Company.CompanyID = dbo.tb_Division.DivisionCompanyID

Любая помощь или ссылки очень ценятся.

Ответы [ 4 ]

1 голос
/ 08 июля 2010

Вам понадобится еще один JOIN, в который вы вернете компании, имеющие более одного подразделения, с помощью предложений GROUP BY и HAVING.

Вы можете прочитать о группировке здесь

Группирует выбранный набор строк в набор итоговых строк по значениям одного или нескольких столбцов или выражений.Одна строка возвращается для каждой группы.Агрегатные функции в списке предложений SELECT предоставляют информацию о каждой группе вместо отдельных строк.

SELECT   dbo.tb_Company.CompanyID
        , dbo.tb_Company.CompanyName
        , dbo.tb_Division.DivisionName 
FROM    dbo.tb_Company 
        INNER JOIN dbo.tb_Division ON dbo.tb_Company.CompanyID = dbo.tb_Division.DivisionCompanyID
        INNER JOIN (
          SELECT  DivisionCompanyID
          FROM    dbo.tb_Division
          GROUP BY
                  DivisionCompanyID
          HAVING  COUNT(*) > 1
        ) d ON d.DivisionCompanyID = dbo.tb_Company.CompanyID
0 голосов
/ 08 июля 2010

Как насчет ...

SELECT dbo.tb_Company.CompanyID,
       dbo.tb_Company.CompanyName, 
    FROM dbo.tb_Company
    WHERE (SELECT COUNT(*)
               FROM dbo.tb_Division
               WHERE dbo.tb_Company.CompanyID =
                          dbo.tb_Division.DivisionCompanyID) > 1;
0 голосов
/ 08 июля 2010

другая альтернатива ...

SELECT c.CompanyId, c.CompanyName, d.DivisionName
FROM tbl_Company c
INNER JOIN tbl_Division d ON c.CompanyId=d.DivisionCompanyId
GROUP BY c.CompanyId, c.CompanyName, d.DivisionName
HAVING COUNT(*) > 1
0 голосов
/ 08 июля 2010

Как насчет?

WITH COUNTED AS
(
  SELECT C.CompanyID, C.CompanyName, D.DivisionName,
         COUNT() OVER(PARTITION BY C.CompanyID) AS Cnt
  FROM dbo.tb_Company C
  INNER JOIN dbo.tb_Division D ON C.CompanyID = D.DivisionCompanyID
)
SELECT *
FROM COUNTED
WHERE Cnt > 1

С другими решениями (которые объединяются в таблицу Division дважды), одна компания / подразделение может быть возвращена при большой нагрузке вставки.

Если строка вставляется в таблицу Division между временем первого соединения и временем вычисления второго соединения (с group by / having), первое соединение Division возвратит один ряд. Тем не менее, второй вернет счет 2.

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