Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
不存在具有的嵌套SQL查询_Sql_Postgresql_Rdbms - Fatal编程技术网

不存在具有的嵌套SQL查询

不存在具有的嵌套SQL查询,sql,postgresql,rdbms,Sql,Postgresql,Rdbms,我一直在想这个问题,但没能解决 关系模式: Airportname,country->name是主键 Flightdep_airport,arr_airport->这两个属性都是引用Airportname的外键 问题是: 查找没有任何国际航班的意大利机场。这个 SQL查询必须嵌套并使用NOT EXISTS运算符 这是我目前为止所做的,但它不起作用: SELECT A.name FROM airport AS A WHERE NOT EXISTS ( SELECT dep_airport.

我一直在想这个问题,但没能解决

关系模式:

Airportname,country->name是主键

Flightdep_airport,arr_airport->这两个属性都是引用Airportname的外键

问题是:

查找没有任何国际航班的意大利机场。这个 SQL查询必须嵌套并使用NOT EXISTS运算符

这是我目前为止所做的,但它不起作用:

SELECT A.name
FROM airport AS A
WHERE NOT EXISTS (
    SELECT dep_airport.name AS dep_name, 
        dep_airport.country AS dep_country,
        arr_airport.name AS arr_name, 
        arr_airport.country AS arr_country
    FROM flight
    INNER JOIN airport dep_airport ON dep_airport.name = flight.dep_airport
    INNER JOIN airport arr_airport ON arr_airport.name = flight.arr_airport
    WHERE dep_airport.country <> arr_airport.country)
还有,如何将其作为关系代数查询编写


谢谢:

这可能有用。。。如果没有,就忽略它

CREATE TABLE Airports (
  Name VARCHAR(50),
  Country VARCHAR(50)
);

INSERT INTO Airports
VALUES  ('ABC', 'Italy'), ('DEF', 'Germany'), 
        ('GHI', 'Italy'), ('JKL', 'France'), 
        ('MNO', 'England'), ('PQR', 'Italy');

CREATE TABLE Flights (
  Departing VARCHAR(50),
  Arriving VARCHAR(50)
);

INSERT INTO Flights
VALUES  ('ABC', 'PQR'), ('ABC', 'GHI'), 
        ('GHI', 'DEF'), ('JKL', 'GHI'), 
        ('MNO', 'PQR'), ('PQR', 'GHI'), ('ABC', 'PQR');


SELECT DISTINCT Departures.Name
FROM (Flights INNER JOIN Airports Departures ON Departures.Name = Flights.Departing) 
    INNER JOIN Airports Arrivals ON Arrivals.Name = Flights.Arriving
WHERE Departures.Country = Arrivals.Country
      AND EXISTS (SELECT * 
                  FROM Airports
                  WHERE Airports.Country = 'Italy')

我发现,如果将这些类型的查询分解为逻辑块,它们会更容易

你需要做的第一件事就是找到所有的意大利机场

Select * from #Airports Where Country = 'Italy'
您需要做的第二件事是查找从抵达机场不是意大利的每个机场起飞的所有航班

Select * 
from #Flights 
Inner Join #Airports on #Flights.Arriving = #Airports.Name
And #Airports.Country <> 'Italy'
Select * 
from #Flights 
Inner Join #Airports on #Flights.Departing= #Airports.Name
And #Airports.Country <> 'Italy'
现在你需要做完全相反的事情,找到所有从出发机场不是意大利的机场抵达的航班

Select * 
from #Flights 
Inner Join #Airports on #Flights.Arriving = #Airports.Name
And #Airports.Country <> 'Italy'
Select * 
from #Flights 
Inner Join #Airports on #Flights.Departing= #Airports.Name
And #Airports.Country <> 'Italy'
此时,您有了满足需求所需的3条语句,但您必须将它们放在一条语句中。您将从您的第一条语句开始,因为这是您想要返回给用户的机场列表。然后,您将使用not exists for each将接下来的两条语句添加为子查询

Select  *
From    #Airports A
Where   Country = 'Italy'
And Not Exists  (
                    Select  1
                    From    #Flights F
                    Inner Join #Airports ASub on F.Arriving = ASub.Name
                    Where   A.Name = F.Departing
                    And     ASub.Country <> 'Italy'
                )
AND Not Exists  (
                    Select  1
                    From    #Flights F
                    Inner Join #Airports ASub on F.Departing = ASub.Name
                    Where   A.Name = F.Arriving
                    And     ASub.Country <> 'Italy'
                )
您应该注意到对这两个Not Exists语句的一些细微调整。主要是,我给Airports表添加了别名,并在where子句中添加了一个条件。Airports的别名是因为我在外部语句和内部子查询语句中选择Airports。如果我不这样做,它会把这两个词搞混,不知道该用哪个词。我做的最后一件事是将这两个notexists绑定回主查询。这就是所谓的关联,这只是一种确保当你从航班中选择时,你只会选择意大利机场的航班

Select * from #Airports Where Country = 'Italy'

Exists和Not Exists语句的主要优点之一是,它通常允许您从语句中删除distinct关键字。当返回大数据集时,Distinct可能会导致严重的性能问题。它还可以使查询更易于阅读。

是否为这些表设置了架构?为什么不为链接到其他表的每个机场设置主id呢?我经常发现它们更容易作为左反连接写入,即写入左连接,然后在右侧为空的位置添加。但它看起来像是家庭作业,规定了你该怎么做。无论如何,请显示模式。提示:在EXISTS或NOT EXISTS中,在SELECT子句中返回任何数据都没有意义;只需从中选择1。。。其中…您的子查询似乎也不相关。在子查询中的任何位置都不引用。所以它不能做你认为它能做的事。您不需要在内部查询中两次加入机场,您可以使用OR条件并在一行中测试两个方向,使用机场a作为其他机场,因此您可以检查a到其他_机场或从其他_机场到其他_机场所在国家的航班!=A的国家。希望这能让你开始。感谢所有的提示,我仍在努力让它发挥作用。我承认这没有用。使用它有什么特别的要求吗?是的,它必须使用不存在。使用存在,它必须不存在:否则我可能会找到答案,这只是令人讨厌的不存在的要求…@Bartek:这不令人讨厌;这是表达您需求的最自然的方式:选择*从a机场a选择a.country=‘italy’而不存在选择*从航班x加入国家y在x.id2=y.id上选择x.id=a.id和y.country‘italy’或者…谢谢,这帮了大忙,我刚刚开始工作:如何将其转换为关系代数?