让我们说我需要找到所有具有某人特定注册类型用户的人......我想要用户的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
...
答案 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的答案一样好,但我不希望经常这样做,所以我更喜欢可维护性而不是性能。