Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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
MySQL语句的不同格式/效率_Mysql_Performance_Join_Subquery - Fatal编程技术网

MySQL语句的不同格式/效率

MySQL语句的不同格式/效率,mysql,performance,join,subquery,Mysql,Performance,Join,Subquery,这是一个运行此语句的不同方式的问题,或者是一种使其更有效的方式 本声明旨在列出最快离开现场的所有员工,但他们也必须在今天到达现场 SELECT e.EmpName, cs.SiteName FROM Employee e INNER JOIN EmployeeAssignment ea ON e.EmpId = ea.EmpId INNER JOIN CustomerSite cs ON ea.CustId = cs.CustId WHE

这是一个运行此语句的不同方式的问题,或者是一种使其更有效的方式

本声明旨在列出最快离开现场的所有员工,但他们也必须在今天到达现场

SELECT 
    e.EmpName,
    cs.SiteName
FROM
    Employee e
INNER JOIN
    EmployeeAssignment ea
ON
    e.EmpId = ea.EmpId
INNER JOIN
    CustomerSite cs
ON
    ea.CustId = cs.CustId
WHERE 
    e.EmpId IN
    (
    SELECT
        ea.EmpId
    FROM
        EmployeeAssignment ea
    WHERE
         ea.EndDate IN
            (
            SELECT 
                MIN(ea.EndDate)
            FROM 
                 EmployeeAssignment ea
             WHERE
                GETDATE() BETWEEN ea.StartDate AND ea.EndDate
             GROUP BY 
                CustId
             ));
如果有人想用更好的方式写这封信,请回复谢谢:)

试试这个

SELECT  
    e.EmpName, 
    cs.SiteName 
FROM 
    Employee e 
INNER JOIN 

(
 SELECT  custid,empid from EmployeeAssignment ea1 where Enddate=( 
             select MIN(ea.EndDate) 
            FROM  
                 EmployeeAssignment ea 
             WHERE 
                GETDATE() BETWEEN ea.StartDate AND ea.EndDate 
                and ea.custid=ea1.custid
             )
) as ea
ON 
    e.EmpId = ea.EmpId 
INNER JOIN 
    CustomerSite cs 
ON 
    ea.CustId = cs.CustId 

这可能有效,也可能无效:

SELECT 
    e.EmpName,
    cs.SiteName
FROM
    Employee e
INNER JOIN
    EmployeeAssignment ea
ON
    e.EmpId = ea.EmpId
INNER JOIN
    CustomerSite cs
ON
    ea.CustId = cs.CustId
GROUP BY   
e.EmpName,
cs.SiteName
HAVING ea.EndDate = 
        (
        SELECT 
            MIN(ea.EndDate)
        FROM 
             EmployeeAssignment ea
         WHERE
            GETDATE() BETWEEN ea.StartDate AND ea.EndDate);

这不起作用,因为如果ea.EndDate不在聚合或order by子句中,则不能在having子句中包含它,但在ordeby子句中,它不会显示所有结果。感谢您的尝试,您可以将ea.EndDate放在MIN aggregate之后,因为我们正在寻找最小日期,因为最后一个ea.CustId是无效的列名??