我有一个包含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中的查询生成器?查询对我来说太大了,无法手动构建。
非常感谢提前!
答案 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