Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将参数从查询传递到子查询?_C#_Mysql_Sql - Fatal编程技术网

C# 如何将参数从查询传递到子查询?

C# 如何将参数从查询传递到子查询?,c#,mysql,sql,C#,Mysql,Sql,在MySQL工作台中,我可以做类似的事情 SELECT projects.ProjectName , @a:=projects.StartDate FROM projects INNER JOIN ( SELECT COUNT(*), projectID FROM eventTable WHERE eventTime > @a GROUP BY e

在MySQL工作台中,我可以做类似的事情

SELECT 
    projects.ProjectName
    , @a:=projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*), projectID 
                 FROM eventTable 
                 WHERE eventTime > @a 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID;
(我的查询实际上要长得多,但这个简单的查询可以显示我的问题)

在C#中,每个参数都需要使用
MySqlCommand.Parameters.AddWithValue(“@a”,…)


如何将参数从顶部查询传递到子查询?

就您的查询而言,我想知道您是否过于复杂了。拥有子查询会增加处理需求,因此通常最好找到替代解决方案

如注释中所述,您不需要将该项作为参数传递给子查询,因为任何联接表值都可以在链接中的子查询中使用。以您的例子:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*), projectID 
                 FROM eventTable 
                 WHERE eventTime > projects.StartDate 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID
我希望您以后可能会对这个子查询做一些形式的额外工作,可能是在
WHERE
子句中。在本例中,我建议您可能最终也会研究一些选项,例如
groupby
HAVING
,这些选项不需要您为每一行运行子查询

使用您的查询,并假设您想知道项目启动后在何处启动了超过10个事件:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    -- Using a left join so you can have a count of 0
    LEFT JOIN eventTable ON eventTable.ProjectID = projects.ProjectID
WHERE
    eventTable.eventTime > projects.StartDate
GROUP BY
    projects.ProjectName
    , projects.StartDate 
HAVING 
    COUNT(*) > 10
我的回答主要是猜测,如果你想补充更多关于正在经历的实际问题的细节,我很高兴再次研究这个问题。但如前所述,在您的示例中,实际上不需要使用参数


编辑/添加:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*) totalEvents, MAX(eventTime) lastEventTime, projectID 
                 FROM eventTable 
                 WHERE eventTime > projects.StartDate 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID
SELECT 
    projects.ProjectName
    , projects.StartDate 
    , COUNT(*) totalEvents
    , MAX(eventTime) lastEventTime
FROM
    projects
    -- Using a left join so you can have a count of 0
    LEFT JOIN eventTable ON eventTable.ProjectID = projects.ProjectID
WHERE
    eventTable.eventTime > projects.StartDate
GROUP BY
    projects.ProjectName
    , projects.StartDate 
添加以下信息:

我需要的结果是一个项目列表(显示),每个项目有多少个事件,最后一个是什么时候

事件表有1000多万条记录,而项目有20条

让我觉得,我认为子查询(据我所知,它扫描整个表)和连接到一个大表的效率大约相当。MySql通常非常擅长优化自己的查询;我知道,使用函数,例如,将经常给出如何改进索引等方面的指针

以下是我对上述评论的建议:

子查询:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*) totalEvents, MAX(eventTime) lastEventTime, projectID 
                 FROM eventTable 
                 WHERE eventTime > projects.StartDate 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID
SELECT 
    projects.ProjectName
    , projects.StartDate 
    , COUNT(*) totalEvents
    , MAX(eventTime) lastEventTime
FROM
    projects
    -- Using a left join so you can have a count of 0
    LEFT JOIN eventTable ON eventTable.ProjectID = projects.ProjectID
WHERE
    eventTable.eventTime > projects.StartDate
GROUP BY
    projects.ProjectName
    , projects.StartDate 
加入:

SELECT 
    projects.ProjectName
    , projects.StartDate 
FROM
    projects
    INNER JOIN ( SELECT COUNT(*) totalEvents, MAX(eventTime) lastEventTime, projectID 
                 FROM eventTable 
                 WHERE eventTime > projects.StartDate 
                 GROUP BY eventTime) AS tbl
    ON projects.ProjectID = tbl.projectID
SELECT 
    projects.ProjectName
    , projects.StartDate 
    , COUNT(*) totalEvents
    , MAX(eventTime) lastEventTime
FROM
    projects
    -- Using a left join so you can have a count of 0
    LEFT JOIN eventTable ON eventTable.ProjectID = projects.ProjectID
WHERE
    eventTable.eventTime > projects.StartDate
GROUP BY
    projects.ProjectName
    , projects.StartDate 

评论中对每一项性能的任何反馈显然也会对我的学习有很大帮助:-)

一个参数将立即在任何地方可用;但是,我可以检查一下:您是否可以不只是引用内部查询中的列?i、 e.
where eventTime>projects.StartDate
?我在找到了解决方案。需要在连接字符串中添加:“Allow User Variables=True”Marc,谢谢您的回答。否我无法在子查询中引用外部查询的列。子查询没有“意识到”主查询。谢谢,我将尝试删除子查询。我需要的结果是一个项目列表(显示),每个项目有多少个事件,最后一个是什么时候。事件表有超过1000万条记录,而项目有20条记录,因此我不想联接它们。子查询出现错误:“where子句”中的未知列“projects.StartDate”联接查询存在一个问题,即“count”在联接表上起作用,因此向所有项目重新联接相同的值。我不想浪费你的时间,因为我用“允许用户变量=True”解决了这个问题,再次感谢。