繁体   English   中英

连接具有多个条件的表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM