【问题标题】:How to use alias for sub queries in where clause如何在 where 子句中为子查询使用别名
【发布时间】:2018-10-24 22:34:21
【问题描述】:

我应该如何在子查询中使用别名以便从subquery 中获取列?

select R.date, M.bcr from MMS M 
where M.CampaignID in 
(
SELECT MR.CampaignID
FROM [Snipp_Receipts].[dbo].[MMS_Receipts] MR 
where MR.CampaignID = '0ab109b5'
) R

注意:CampaignID 是两个表中的外键。

我怎样才能做到这一点? inner join 提供更多记录。 subquery 有 136 条记录,我必须在 MMS table 中获取与匹配 subquery 记录相对应的其他字段。

【问题讨论】:

  • 表结构、样本数据和预期结果会有所帮助。你在哪里选择r.date?是来自mms_receipts 吗?根据您的 cmets,如果收据表中存在多行,它应该返回哪个日期?我们需要更多信息来提供帮助...
  • 嗨。您使用的是什么选择语句的参考,它说了什么,它的示例显示了什么以及为什么您认为您可以编写它?你在谷歌上搜索你的错误信息学到了什么?请阅读How to Ask 和向下投票箭头鼠标悬停文本重新研究。请阅读minimal reproducible example。

标签: sql sql-server join c#-4.0


【解决方案1】:

您不能为 IN(...) 中使用的子查询设置别名,并且不能在 select 子句中引用该表的列。你需要一个 JOIN 才能做到这一点。

SELECT
    M.*
FROM MMS M
WHERE M.CampaignID IN (
    SELECT
        MR.CampaignID
    FROM [Snipp_Receipts].[dbo].[MMS_Receipts] MR
    WHERE MR.CampaignID = '0ab109b5'
    ) /* NO alias allowed here */

使用内部连接

SELECT
    M.*
  , MR.date
FROM MMS M
INNER JOIN [Snipp_Receipts].[dbo].[MMS_Receipts] MR ON M.CampaignID = MR.CampaignID
WHERE M.CampaignID = '0ab109b5'

【讨论】:

  • 我明白这一点。加入 FK 会导致多行,根据子查询,输出应该只有 77 条记录。不知道如何继续。
  • 预期的行数告诉我们没有什么特别有用的,说实话。您需要提供数据样本(两个表)
【解决方案2】:

听起来 MMS 中的单个记录正在加入 MMS_Receipts 中的多个记录。您可以汇总 MMS_Receipts 的结果吗?所以是这样的:

SELECT
 M.bcr
,max(MR.date) as [date]
FROM MMS M
INNER JOIN [Snipp_Receipts].[dbo].[MMS_Receipts] MR 
ON M.CampaignID = MR.CampaignID
WHERE M.CampaignID = '0ab109b5'
GROUP BY M.bcr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 2011-04-20
    • 2013-01-29
    • 1970-01-01
    相关资源
    最近更新 更多