【问题标题】:Side by Side column merge并排列合并
【发布时间】:2021-04-09 18:01:17
【问题描述】:

我需要创建一个价格比较工具,所以这样的要求来了。为此,我的数据库查询有两个不同的结果集。我的数据库是 SQL Server 2017 Developer Edition。我想要的是并排合并两个结果集。见下图:

我的查询

SELECT ADuration Duration, APlan_Price AmazonPrice 
FROM tbl_AmazonPlans
WHERE AProduct_Name = 'Air Conditioner'
  AND 14678 BETWEEN TRY_CONVERT(int, PARSENAME(REPLACE(APrice_Range, '-', '.'), 2))
                AND TRY_CONVERT(int, PARSENAME(REPLACE(APrice_Range, '-', '.'), 1))

SELECT Duration, Plan_Price GwPrice
FROM tbl_PlanDetails
WHERE Product_Name = 'Air Conditioner'
  AND 14678 BETWEEN TRY_CONVERT(int, PARSENAME(REPLACE(Price_Range, '-', '.'), 2))
                AND TRY_CONVERT(int, PARSENAME(REPLACE(Price_Range, '-', '.'), 1))

更新

来自表的结果集可能/可能不具有相同的架构。也没有连接点,因为它们没有公共键。但是是的,它们包含一些可能相同的列,并且基于这些相同的列,我必须获得预期的结果集。

【问题讨论】:

  • 您是否假设两个表都包含相同的 Duration 值集?例如,当一个表包含值为 10 的行而另一个不包含时,结果集中应该出现什么?
  • 请不要使用图像作为数据,使用格式化文本。
  • @DaleK - 据我所知,截图比格式化文本更容易和更好地解释问题/结果。此外,如果它不是 SO 团队的社区标准,那么这个(嵌入图像)已被 SO 开发人员自己删除。
  • 不,屏幕截图并不容易或更好......它们被听到阅读,在移动设备上效果不佳并且通常会打断问题的流程。仅在尝试显示用户界面或报告布局时才应使用图像。事实上,样本数据最好使用 DDL+DML 呈现,因为这样人们可以复制和粘贴它来解决您的问题。 Reference
  • Further reference "请勿发布代码、数据、错误消息等的图像..."

标签: sql sql-server tsql sql-server-2017


【解决方案1】:

您可以直接加入表格,但如果您的 where 标准可能不同以保持简单,您可以直接加入结果集

select a.duration, a.AmazonPrice, b.GwPrice
from (
    Select ADuration Duration, APlan_Price AmazonPrice 
    From tbl_AmazonPlans
    Where AProduct_Name ='Air Conditioner'
    and 14678 between try_convert(int,parsename(replace(APrice_Range,'-','.'),2))
                                and try_convert(int,parsename(replace(APrice_Range,'-','.'),1))
)a
join
(
    Select Duration, Plan_Price GwPrice
     From tbl_PlanDetails
     Where Product_Name ='Air Conditioner'
    and 14678 between try_convert(int,parsename(replace(Price_Range,'-','.'),2))
                                and try_convert(int,parsename(replace(Price_Range,'-','.'),1))
)b on a.duration = b.duration

【讨论】:

  • 我会做一个 FULL OUTER JOIN,以包括仅在其中一家商店提供的产品。
  • 看起来每个表中的行都匹配,但肯定同意,如果 OP 在任何一个中都可以有不一致的数据,那么完全连接是合适的;也可能是PlanDetails 表可能只有一部分行,在这种情况下最好有left join。我敢肯定,OP 会知道他的数据。
  • @Stu 请看我的更新。是的,表模式并不相似,但是在每个表中都可以找到像这两个这样的很少的列。这些表之间也没有连接的可能性..
【解决方案2】:

Duration 列是两个表中通用的标识符吗?如果是,那么您可以使用内连接。

select
    Duration,
    APlan_Price as AmazonPrice
    Plan_Price as GwPrice
from tbl_AmazonPlans
inner join tbl_PlanDetails on tbl_PlanDetails.Duration = tbl_AmazonPlans.Duration
where /* Your filter here */

【讨论】:

  • 您遗漏了列 tbl_AmazonPlans.APrice_Range 的转换/比较。您应该使用它来培养良好的编码习惯 - 例如使用语句终止符、定义表别名,然后为每个列引用使用这些别名。
  • 我同意你的观点,但在这种情况下,问题是关于如何并排返回两列的具体问题。用户不需要为表使用别名。这是可选的。关于 where 过滤器,我认为还有其他最佳选择来过滤数据,但我认为目前这无关紧要。我将编辑我的答案,从示例中删除 where 子句。
猜你喜欢
  • 2012-01-18
  • 1970-01-01
  • 2014-12-02
  • 2012-06-10
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多