连接具有多个条件的表格

时间:2016-08-29 20:06:23

标签: sql sql-server

我想要组合两个表并设置多个条件来提取所需的数据: 表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      |
|----------------|------------|------------|------------|

我想将2个表与设置条件组合在一起,以便组合图形具有前50个NameID,Gender,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  |
|------------|------------|------------|------------|--------|--------|

提前致谢。

3 个答案:

答案 0 :(得分:1)

当你离开加入一个表然后你为该表中存在的列放置条件时,你实际上是通过丢弃不满足这个条件的输出中的所有行来进行内连接。由于这是一个左连接,因此连接条件可能会计算为false,但您在WHERE子句中强制执行另一个条件,因此该行将被丢弃,因为它也会计算为false。

我不会遵循整个WHERE子句中的逻辑,但是我已经将一个条件移动到了JOIN子句,并将Response.TrySkipIisCustomErrors = true; 的括号添加到&#34;复杂的&#34 ;条件,以便即使不满足LEFT JOIN,并且在这种情况下OR [Category] IS NULL将是[Category],它仍然在输出中返回行。

NULL

答案 1 :(得分:0)

我不确定我是否遵循了整个问题,但这看起来并不合适:

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
                  )

答案 2 :(得分:0)

看起来你可能没有得到结果的原因是因为你的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,那么它将与您的任何类别都不匹配。

这可能是您没有看到结果的原因,因为您没有类别等于子查询的数量。

相关问题