【问题标题】:Combining the results of two SQL queries组合两个 SQL 查询的结果
【发布时间】:2021-07-02 22:57:31
【问题描述】:

我在两个表中有数据,我需要在一个查询中获取所有数据并加入获取数据。

SELECT 
kpip.PersonalName, 
kpiT.Name, 
kpiPR.KpiTarget, 
kpiPR.KpiResultDate, 
kpiPR.KpiResult
        FROM KpiPersonalResult AS kpiPR join KpiPersonal as kpip 
        on kpiPR.KpiPersonal = kpip.Id join KpiType AS kpiT 
        on kpip.KpiType = kpiT.Id join MerchantAdministrators as merA 
        on kpiPR.KpiAdded = merA.Id and kpiPR.KpiResultDate between '2021-04-07' and '2021-04-08' 
        
        select 
                kpiP.PersonalName, 
                kpiT.Name, 
                kpiP.KpiTarget 
                        from KpiPersonal as kpiP join KpiType as kpiT 
                        on kpiP.KpiType = kpiT.Id

【问题讨论】:

  • 您需要展示一些示例数据、您的预期结果,并说明您希望如何准确地组合这些数据。你考虑过union all吗?

标签: c# sql asp.net sql-server


【解决方案1】:

基于第二个查询有 3 个与第一个查询同名的列的速度,我猜你的意思是合并它们:

SELECT 
  kpip.PersonalName, 
  kpiT.Name, 
  kpiPR.KpiTarget, 
  kpiPR.KpiResultDate, 
  kpiPR.KpiResult
FROM 
  KpiPersonalResult AS kpiPR 
  join KpiPersonal as kpip on kpiPR.KpiPersonal = kpip.Id 
  join KpiType AS kpiT on kpip.KpiType = kpiT.Id 
  join MerchantAdministrators as merA on kpiPR.KpiAdded = merA.Id and kpiPR.KpiResultDate between '2021-04-07' and '2021-04-08' 

UNION ALL

select 
  kpiP.PersonalName, 
  kpiT.Name, 
  kpiP.KpiTarget,
  null, --put suitable default values for the other columns here
  null 
from
  KpiPersonal as kpiP 
  join KpiType as kpiT on kpiP.KpiType = kpiT.Id

联合查询需要相同数量的列。我在第二个查询(相对于第一个)中插入了 NULL 作为两个缺失列的默认值

UNION 使结果集变得更高。如果你打算让它变得更宽,那是通过 JOIN 完成的。这样做的一个简单模式是:

WITH query1 AS(
  --query 1 here
), query2 AS (
  --query2 here
)
SELECT * FROM query1 JOIN query2 ON ...

关于格式化和缩进的附注 - 当所有相关的操作都处于相同的缩进级别时,大多数人发现 SQL 最易读,例如在典型查询中,SELECT FROM WHERE GROUP ORDER 关键字都处于相同的缩进级别,与它们相关的块(选定列的列表,或连接表的列表,where'd 谓词的列表等)再次缩进了一个级别。我们通常也不在给表起别名时使用as,但我们在为 SELECT 中的列起别名时使用它

【讨论】:

  • 兄弟如何不允许从我的组合列表中复制数据?
  • 单独使用UNION 而不是UNION ALL,或者重新配置查询,使其不会选择重复的数据。您应该意识到 UNION 通过相当密集的操作执行重复数据删除 - 如果您可以从源头停止重复而不是在之后尝试删除它们,那么性能可能会更好
猜你喜欢
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
相关资源
最近更新 更多