Нужны результаты больше 1 к 1 - PullRequest
2 голосов
/ 06 марта 2012

У меня есть запрос, и я опрашиваю результаты «Пользователи», соответствующие стране, на данный момент это мой запрос:

SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID

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

Bob   United States
Tom   United States
Steve United Stated

Frank Canada
Billy Canada

Lou   China

, я бы хотел, чтобы результаты были

Bob
Tom
Steve

для Соединенных Штатов и

Frank
Billy

для Канады,но не разрушать Китай, потому что к нему привязан только один пользователь.Но потяните другой, потому что в США и Канаде к нему привязан один пользователь.Возможно ли это в запросе?

Спасибо!

Ответы [ 7 ]

2 голосов
/ 06 марта 2012

Следующие элементы будут выбирать только строки из CountryUser, если есть другая строка с тем же идентификатором страны, но с другим идентификатором пользователя. то есть более одного идентификатора пользователя для этой страны:

SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID
WHERE
  EXISTS
  (SELECT
    NULL
   FROM
    CountryUser CU2
   WHERE
    CU2.[Foreign ID] = CountryUser.[Foreign ID]
    AND CU2.[User ID] <> CountryUser.[User ID])
2 голосов
/ 06 марта 2012

Я не уверен в синтаксисе без базы данных передо мной, но функция ранга была бы хороша для этого:

SELECT * FROM
(
SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  Country.Name,
  Country.ID,
  COUNT(UserColder.ContactName) OVER (PARTITION BY Country.ID) _RANK
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID
) A
WHERE A._RANK > 1

Отредактировано благодаря комментариям :) Также добавлено подтверждение концепции:

SELECT * 
INTO #TEMP
FROM
(
SELECT 'UK' Country, 'Dave' Name
UNION
SELECT 'UK' Country, 'Bob' Name
UNION
SELECT 'UK' Country, 'Alex' Name
UNION
SELECT 'China' Country, 'Mike' Name
UNION
SELECT 'Holland' Country, 'Paul' Name
UNION
SELECT 'Holland' Country, 'James' Name
) A

SELECT * FROM #TEMP

SELECT * FROM
(SELECT Country, Name, Count(Name) OVER (PARTITION BY Country) _RANK FROM #TEMP) A
WHERE A._RANK > 1
2 голосов
/ 06 марта 2012

Попробуйте:

SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser CU
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID
WHERE (SELECT COUNT(CountryUser.[User ID])
       FROM dbo.CountryUser
       WHERE [Foreign ID] = CU.[Foreign ID]) > 1

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

0 голосов
/ 06 марта 2012
;WIth countries AS
(
SELECT
UserColder.ContactName
,CountryUser.[User ID],Country.Name,Country.ID 
,COUNT(UserColder.ContactName) OVER (PARTITION BY Country.ID) AS num_people
FROM dbo.Country
INNER JOIN dbo.CountryUser  
ON Country.ID = CountryUser.[Foreign ID]
INNER JOIN dbo.UserColder  
ON CountryUser.[User ID] = UserColder.ID 
)
SELECT
ContactName
,[User ID]
FROM countries
WHERE num_people > 1
0 голосов
/ 06 марта 2012
SELECT
  UserColder.ContactName,
  CountryUser.[User ID],
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID
where Country.ID in (select CountryID from CountryUser group by CountryID having count(countryid)>1)
0 голосов
/ 06 марта 2012

Вы можете использовать предложение HAVING

В качестве примера: SELECT SalesOrderID, SUM (LineTotal) AS, промежуточный итог из Sales.SalesOrderDetail GROUP BY SalesOrderID, Суммарная сумма (LineTotal)> 100000.00 ЗАКАЗ BY SalesOrderID

0 голосов
/ 06 марта 2012

Становится утомительно, если вам нужно получить информацию о пользователе, но сработает ли это? Он вернет список стран. Можно добавить информацию о пользователе, но запрос получает вид брутто

SELECT
  COUNT(*) count,
  Country.Name,
  Country.ID
FROM
  dbo.Country
  INNER JOIN dbo.CountryUser
    ON Country.ID = CountryUser.[Foreign ID]
  INNER JOIN dbo.UserColder
    ON CountryUser.[User ID] = UserColder.ID
GROUP BY Country.ID, Country.Name
HAVING COUNT(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...