SQL Server - 从两个连接的表数据上下文中选择一个列

时间:2015-05-04 22:05:54

标签: sql sql-server select join union

让我们说我需要找到所有具有某人特定注册类型用户的人......我想要用户的PersonId以及相关的注册信息。人。一个人可以有多个注册,多个人和多个用户。

SELECT DISTINCT person.PersonId, user.PersonId
FROM Person person
INNER JOIN Registration registration
ON person.PersonId = registration.PersonId
INNER JOIN User user
ON registration.UserId = user.UserId
WHERE person.Type = 1
    AND registration.Type = 2
    AND user.Enabled = 1

上面的查询有效,但我希望第一行在单个列中选择 person.PersonId AND user.PersonId ,而不是两个单独的列。我知道这可以通过联盟和两个单独的查询来实现,但是如果可能的话,我试图避免冗余。也许在这种情况下有一种更直观的方式来使用联盟?

类似的东西:

SELECT DISTINCT person.PersonId UNION user.PersonId
FROM Person person
...

或者

SELECT DISTINCT person.PersonId
UNION SELECT DISTINCT user.PersonId
FROM Person person
...

3 个答案:

答案 0 :(得分:1)

我认为你不能避免使用UNION。也许其他人可以提出一种聪明的技巧,但我会这样做:

SELECT person.PersonId
FROM Person person
INNER JOIN Registration registration
ON person.PersonId = registration.PersonId
INNER JOIN User user
ON registration.UserId = user.UserId
WHERE person.Type = 1
    AND registration.Type = 2
    AND user.Enabled = 1
UNION
SELECT user.PersonId 
FROM Person person
INNER JOIN Registration registration
ON person.PersonId = registration.PersonId
INNER JOIN User user
ON registration.UserId = user.UserId
WHERE person.Type = 1
    AND registration.Type = 2
    AND user.Enabled = 1

编辑删除了CTE示例 - 最近过多的SQL Server&我忘了mySQL不支持它们。

答案 1 :(得分:0)

select语句中两个列的CONCAT怎么样?

SELECT CONCAT (person.PersonId,User.PersonId) AS CombinedID

但鉴于您的上述问题,个人和用户的ID不相同吗?

答案 2 :(得分:0)

我现在可以看到查询的目的并不是很清楚,所以这里设置了一些限制条件:

  • 用户是个人
  • 用户有很多注册
  • 注册可以针对某人

作为一个现实世界"这样的例子;我以用户身份登录,我的人员数据已加载。其他人可以与我同时使用该帐户(想想Xbox或Netflix)。

此查询可用于查找给定注册类型的所有人员,以及他们注册的用户的人员。

无论如何,这是我采用的解决方案(感谢John Odom的建议):

SELECT DISTINCT PersonPID = person.PersonId, UserPID = user.PersonId
INTO #TempPersonIds
FROM Person person
INNER JOIN Registration registration
ON person.PersonId = registration.PersonId
INNER JOIN User user
ON registration.UserId = user.UserId
WHERE person.Type = 1
    AND registration.Type = 2
    AND user.Enabled = 1

SELECT PersonPID FROM #TempPersonIds
UNION
SELECT UserPID FROM #TempPersonIds
DROP TABLE #TempPersonIds

我意识到这可能与Turophile的答案一样好,但我不希望经常这样做,所以我更喜欢可维护性而不是性能。