Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 SQL SELECT在联接中查找类似子字符串的名称_Mysql_Sql_Sql Server_Tsql - Fatal编程技术网

Mysql SQL SELECT在联接中查找类似子字符串的名称

Mysql SQL SELECT在联接中查找类似子字符串的名称,mysql,sql,sql-server,tsql,Mysql,Sql,Sql Server,Tsql,我该如何解决这个问题 我的SQL语句是: select ename from employee e inner join certified c on e.eid = c.eid inner join aircraft a on c.aid = a.aid where cruisingrange> 1000 && a.aname not like'%b' 这个问题的答案是雅各布和艾米丽,这是错误的。雅各布不应该被找回 我应该如何修改或添加S

我该如何解决这个问题

我的SQL语句是:

select ename 
from employee e 
    inner join certified c on e.eid = c.eid 
    inner join aircraft a on c.aid = a.aid 
    where cruisingrange> 1000 && a.aname not like'%b'
这个问题的答案是雅各布和艾米丽,这是错误的。雅各布不应该被找回

我应该如何修改或添加SQL语句

脚本:

CREATE TABLE Employee (
    Eid int, 
    Ename nvarchar(100), 
    Salary int
)

INSERT INTO Employee VALUES
(1,'Jacob',85000),(2,'Michael',55000),(3,'Emily',80000),
(4,'Ashley',110000),(5,'Daniel',80000),(6,'Olivia',70000)

CREATE TABLE Aircraft (
    Aid int, 
    Aname nvarchar(100), 
    Cruisingrange int
)

INSERT INTO Aircraft VALUES
(1,'a1',800),(2,'a2b',700),(3,'a3',1000),
(4,'a4b',1100),(5,'a5',1200)

CREATE TABLE Flight (
    Flno int, 
    Fly_from nvarchar(100), 
    Fly_to nvarchar(100), 
    Distance int,
    Price int
)

INSERT INTO Flight VALUES
(1,'LA','SF',600,65000),(2,'LA','SF',700,70000),(3,'LA','SF',800,90000),
(4,'LA','NY',1000,85000),(5,'NY','LA',1100,95000)

CREATE TABLE Certified (
    Eid int, 
    Aid int, 
    CertDate date
)

INSERT INTO Certified VALUES
(1, 1, '2005-01-01'),(1, 2, '2001-01-01'),(1, 3, '2000-01-01'),
(1, 5, '2000-01-01'),(2, 3, '2002-01-01'),(2, 2, '2003-01-01'),
(3, 3, '2003-01-01'),(3, 5, '2004-01-01')

我会在任何一行上阅读“未经认证”作为是否存在行的检查

如果存在匹配行,则不返回员工。仅当匹配行不存在时才返回雇员

您将如何找到匹配的行,以确定某个员工是否通过了任何认证

有几种方法。使用1反连接和2不存在相关子查询的两种最佳方法

示例不存在相关子查询

在这两种方法中,这一种更容易看出它是如何工作的

  FROM e
 WHERE NOT EXISTS ( SELECT 1
                      FROM certified c
                      JOIN aircraft a 
                        ON a.id = c.a_id
                     WHERE a.aname LIKE '%b%'   
                       AND c.e_id = e.id
                  ) 
注意子查询谓词中对外部表e.id的引用。子查询与外部查询相关联

考虑这样的情况:对于外部查询返回的每一行,都执行子查询,并传入e.id的值。优化器不必以这种方式执行操作;这只是一种简单的方式来思考我们的要求

如果子查询返回1行或多行,则满足条件EXISTS,并返回TRUE。如果子查询返回零行,则EXISTS的计算结果为FALSE

反连接模式示例

这种方法可能需要一点时间才能让你的大脑清醒过来。一旦您获得了它,它将是一个非常宝贵的工具,可以在SQL工具带中随时使用

如果我们使用一个外部联接,并从e中撤回所有行以及任何匹配行,那么我们可以排除找到匹配行的行

  FROM e
  LEFT
  JOIN ( SELECT c.e_id
           FROM certified c
           JOIN aircraft a
             ON a.id = c.a_id
          WHERE a.aname LIKE '%b%'
         GROUP BY c.e_id
       ) b
    ON b.e_id = e.id
 WHERE b.e_id IS NULL
内联视图查询具体化为名为b的派生表。该查询旨在返回经认证可以驾驶任何符合指定标准的飞机的每位员工的id。然后,派生表中的行被外部连接到e

诀窍是外部联接包括有匹配项的行和没有匹配项的行,以及WHERE子句中排除有匹配项的行的条件

我希望其他人会提供如何使用NOT IN子查询的示例。使用这种方法,当心如果子查询返回任何空值会发生什么。提示:您需要确保子查询永远不会返回NULL

这表明,满足以下条件的几种可能方法中只有两种是未经任何标准认证的

显然,需要添加额外的联接/子查询来评估查询中的其他条件

您可以在SQL Server中使用此查询,也许它也可以在MySQL上使用:

SELECT e.Ename
FROM Employee e 
INNER JOIN Certified c 
    ON e.Eid = c.Eid 
LEFT JOIN aircraft a 
    ON c.Aid = a.Aid and a.Cruisingrange> 1000
LEFT JOIN aircraft a1 
    ON c.Aid = a1.Aid and a1.aname like'%b%'
GROUP BY e.Ename
HAVING MAX(a.Aid) IS NOT NULL AND MAX(a1.Aid) IS NULL

我们将所有需要的表与需要的条件连接起来。然后我们按Ename分组并使用MAXa。Aid不为空,这意味着飞行员可以驾驶巡航距离>1000且MAXa1的飞行器。Aid为空意味着他没有在任何名为b的飞机上获得认证。

链接中断。将所有必要的信息直接添加到问题中为什么这个问题被否决?它有一个明确的问题,它有一个OP试图使用的查询,缺少数据样本,但这是固定的。