对连接的查询执行连接

2022-03-07 00:00:00 sql sql-server ssms

我有一个包含20多个表的数据库,我正尝试将这些表连接到一个大查询中,以便创建报告。我已经成功地通过SSMS查询构建器创建了一个基本报告,但是有一个表造成了麻烦,因为有一个字段对于同一唯一ID可以有两个值(输入或输出),我在报告中得到了重复的行,其中所有其他数据都重复,最后显示包含输入和输出相关字段的信息。

我猜这是一种经典问题,但不知道如何解决,也不知道这叫什么。

考虑下表(A):

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

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

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

表(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     |

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

SELECT * FROM
(SELECT 
t1.Type as "Type 1", t1.information as "Info 1", t1.uniqueID as "unique ID type 1", t2.uniqueID as "unique ID type 2", t2.Type as "Type 2", t2.Information1 as "Info 2"
FROM 
(SELECT uniqueID, type, information1, information2, Notes, from TABLE where type = 'IN') as t1, 
(SELECT uniqueID, type, information1, information2, Notes, from TABLE where type = 'OUT') as t2
WHERE 
t1.uniqueID = t2.uniqueID) as X1;

请不要只包含唯一ID列以证明查询有效。

原始表也稍大一些,尽量在这里保持简短。

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

如您所见,我尝试创建X1变量,然后我认为我可以在X1.t1.Unique eID之类的东西上进行联接。然而,这是行不通的。我的编辑器甚至不能识别X1.t1.Unique eID,然后在执行时由于同样的原因而失败。您知道如何实现我需要的功能吗?最好是通过使用SSMS中的查询构建器来实现。查询变得太大,我无法手动构建。

提前表示感谢!


解决方案

您当前的方法效率不高。其他人通常会使用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或派生表

-- 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

相关文章