对已加入的查询执行联接

时间:2018-04-13 04:04:29

标签: sql sql-server ssms

我有一个包含20多个表的数据库,我试图加入一个大查询以创建报告。我已成功通过SSMS查询构建器创建基本报告,但是一个表导致了问题,因为有一个字段可以为同一个uniqueID提供两个值(in或out),我在报告中得到重复的行,重复所有其他数据,最后显示包含输入和输出相关字段的信息。

我想这是一个经典问题,但不知道如何解决它或者这个问题。

考虑下表(A):

	<nav>
		<div class="container"><a class="logo">Timer</a>
		<div class="icon"><a href="" id="bar" type="button"><i class="fas fa-bars">text</i></a></div>
				<ul class="menu" id="menu">
					<li><a href="">Home</a></li>
					<li><a href="">About</a></li>
					<li><a href="">Services</a></li>
					<li><a href="">Pages</a></li>
					<li><a href="">Contact</a></li>
          
				</ul>
		</div>
	</nav>

我的报告中的结果是,两种类型的每一行都会重复所有其他信息。

在这里对SO how to join two SQL queries进行了一些研究之后,我找到了一个解决方案,它允许我从该表中提取信息,以便信息在列而不是行上正确分布。

表(B):

+------+--------------+--------------+--------+----------+
| type | information1 | information2 | Notes  | uniqueID |
+------+--------------+--------------+--------+----------+
| IN   | infoA        | anotherinfo1 | NotesA | SN1      |
+------+--------------+--------------+--------+----------+
| OUT  | infoB        | anotherinto2 | NotesB | SN2      |
+------+--------------+--------------+--------+----------+

用于创建表B的相关查询:

Type 1     |Info 1             |unique ID type 1  |unique ID type 2  |Type 2     |Info 2           |
-----------|-------------------|------------------|------------------|-----------|-----------------|
IN         |Information 1      |SerialNumber1     |SerialNumber1     |OUT        |Information2     |
IN         |Information 1      |SerialNumber2     |SerialNumber2     |OUT        |Information2     |

请注意,仅包含唯一ID列以证明查询有效。

原始表格也有点大,试图在这里保持简短。

现在主要问题:如何将我的查询合并到我的大查询中?

正如你所看到的,我试图创建X1变量,然而我可以在X1.t1.uniqueID之类的东西上进行连接。但是,这不起作用。在我的编辑器中甚至无法识别X1.t1.uniqueID,然后在执行时出于同样的原因失败。任何想法如何实现我需要的,最好是通过使用像SSMS中的查询生成器?查询对我来说太大了,无法手动构建。

非常感谢提前!

1 个答案:

答案 0 :(得分:0)

您当前的方法效率不高。其他人通常会使用CASE WHEN来做这件事。

SELECT   t.uniqueID,
         IN_Info1 = MAX(case when t.type = 'IN' then t.information1 end),
         IN_Info2 = MAX(case when t.type = 'IN' then t.information2 end),
         IN_Notes = MAX(case when t.type = 'IN' then t.Notes end),
         OUT_Info1 = MAX(case when t.type = 'OUT' then t.information1 end),
         OUT_Info2 = MAX(case when t.type = 'OUT' then t.information2 end),
         OUT_Notes = MAX(case when t.type = 'OUT' then t.Notes end)
FROM     TABLEB t
GROUP BY t.uniqueID

然后要在您的大查询中加入,您可以使用CTE或DERIVED TABLE

-- CTE
; with Tblb as
(
  SELECT   t.uniqueID,
           IN_Info1 = MAX(case when t.type = 'IN' then t.information1 end),
           IN_Info2 = MAX(case when t.type = 'IN' then t.information2 end),
           IN_Notes = MAX(case when t.type = 'IN' then t.Notes end),
           OUT_Info1 = MAX(case when t.type = 'OUT' then t.information1 end),  
           OUT_Info2 = MAX(case when t.type = 'OUT' then t.information2 end),  
           OUT_Notes = MAX(case when t.type = 'OUT' then t.Notes end)
  FROM     TABLEB t
  GROUP BY t.uniqueID
)
select   *
from     TableA a
         inner join Tblb b ON a.uniqueID = b.uniqueID

您无法执行此操作X1.t1.uniqueID.,它应该只是X1.uniqueID