[英]Joining tables with multiple conditions
我有两个表要合并并设置多个条件以提取所需的数据:表1:[Folder1]。[Name]。[Info]
|---------------------|------------------|------------------|
| NameID | Gender | DoB |
|---------------------|------------------|------------------|
| 1 | M | 19800909 |
|---------------------|------------------|------------------|
| 2 | M | 19620102 |
|---------------------|------------------|------------------|
| 3 | F | 19501012 |
|---------------------|------------------|------------------|
| 4 | F | 19900212 |
|---------------------|------------------|------------------|
| 5 | M | 19501010 |
|---------------------|------------------|------------------|
表2:[Folder1]。[Body]。[Sign]
|----------------|------------|------------|------------|
| NameID | BODYID | Category | Result |
|----------------|------------|------------|------------|
| 1 | 80000001 | Height | 178 |
|----------------|------------|------------|------------|
| 1 | 80000002 | Waist | 32 |
|----------------|------------|------------|------------|
| 1 | 80000003 | weight | 78 |
|----------------|------------|------------|------------|
| 1 | 80000003 | weight | 85 |
|----------------|------------|------------|------------|
| 2 | 80000001 | height | 170 |
|----------------|------------|------------|------------|
| 2 | 80000002 | waist | 30 |
|----------------|------------|------------|------------|
| 2 | 80000003 | weight | 78 |
|----------------|------------|------------|------------|
| 2 | 80000003 | weight | 80 |
|----------------|------------|------------|------------|
| 2 | 80000003 | weight | 76 |
|----------------|------------|------------|------------|
| 3 | 80000001 | height | 168 |
|----------------|------------|------------|------------|
| 4 | 80000001 | height | 170 |
|----------------|------------|------------|------------|
| 5 | 80000001 | height | 171 |
|----------------|------------|------------|------------|
我想将这两个表与设置的条件结合在一起,以便合并后的图形具有前50个NameID,性别,DoB,BodyID,类别,类别,在19900101之前具有DoB的人的结果,仅显示身高和体重数据,并且仅显示人3个或更多体重数据。
我现在拥有的当前SQL代码是:
SELECT TOP 50 [Info].[NameID]
,[Gender]
,[DoB]
,[BodyID]
,[Category]
,[Result]
FROM [Folder1].[Name].[Info] LEFT JOIN [Folder1].[Body].[Sign]
ON [Info].[NameID] = [Sign].[NameID]
WHERE ([DoB] < '19900101')
AND ([Category] = 'Weight' OR [Category] = 'Height')
AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end) FROM [Folder1].[Body].[Sign] GROUP BY [Category] HAVING COUNT([BODYID]) >2)
ORDER BY [NameID]
该查询可以成功执行,并显示一个表,但是没有信息出现。 我觉得该“计数”部分出了问题,但无法弄清楚这有什么问题。
我希望得到的结果是这样的:
|------------|------------|------------|------------|--------|--------|
| NameID | Gender | DoB | BODYID |Category|Result |
|------------|------------|------------|------------|--------|--------|
| 2 | M | 19620102 | 80000001 |Height | 170 |
|------------|------------|------------|------------|--------|--------|
| 2 | M | 19620102 | 80000003 |Weight | 78 |
|------------|------------|------------|------------|--------|--------|
| 2 | M | 19620102 | 80000003 |Weight | 80 |
|------------|------------|------------|------------|--------|--------|
| 2 | M | 19620102 | 80000003 |Weight | 76 |
|------------|------------|------------|------------|--------|--------|
提前致谢。
当您离开联接表,然后为该表中存在的列设置条件时,实际上是在内部联接中,通过丢弃输出中不满足该条件的所有行。 由于这是左联接,因此联接条件可能会评估为false,但您正在WHERE子句中强制执行另一个条件,因此该行将被丢弃,因为它的评估结果也会为false。
我不会遵循整个WHERE子句中的逻辑,但是我将一个条件移到了JOIN子句中,并在“复杂”条件中添加了带有OR [Category] IS NULL
括号,以便即使不满足LEFT JOIN ,在这种情况下, [Category]
为NULL
它仍在输出中返回行。
SELECT TOP 50 [Info].[NameID]
,[Gender]
,[DoB]
,[BodyID]
,[Category]
,[Result]
FROM [Folder1].[Name].[Info] LEFT JOIN [Folder1].[Body].[Sign]
ON [Info].[NameID] = [Sign].[NameID] AND [Sign].[Category] IN ('Weight', 'Height')
WHERE [DoB] < '19900101'
AND ( [Category] IN ( ... ) OR [Category] IS NULL )
ORDER BY [NameID]
我不确定我是否会遵循整个问题,但这绝对不正确:
AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end)
FROM [Folder1].[Body].[Sign]
GROUP BY [Category]
HAVING COUNT([BODYID]) > 3
)
我没有完全遵循逻辑,但是我可以想象您想要:
AND [Category] IN (SELECT [Category]
FROM [Folder1].[Body].[Sign]
GROUP BY [Category]
HAVING COUNT([BODYID]) > 3
)
也许:
AND [Category] IN (SELECT [Category]
FROM [Folder1].[Body].[Sign]
GROUP BY [Category]
HAVING SUM(case when [BODYID] = 80000003 then 1 else 0 end) > 3
)
您似乎无法获得结果的原因似乎是因为where子句中有一个SELECT COUNT。 下面的代码显示了问题所在。
AND [Category] IN (SELECT Count(case when [BODYID] = 80000003 then 1 else null end)
FROM [Folder1].[Body].[Sign] GROUP BY [Category] HAVING COUNT([BODYID]) >3)
问题在于,您正在将一个似乎是varchar的类别与一个将返回int值的计数进行比较。 因此,如果子查询的计数= 10,则它将与您的任何类别都不匹配。
这很可能是您看不到结果的原因,因为您没有与子查询数量相等的类别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.