1

我在 Netezza 有 3 张桌子。

表 1:商店

CREATE TABLE STORES
(
    STORE_NAME CHARACTER VARYING(10),
    STORE_TYPE CHARACTER VARYING(10)
);

表 2:城市

CREATE TABLE CITIES
(
    CITY CHARACTER VARYING(10)
);

表 3:CITIES_STORES

CREATE TABLE CITIES_STORES
(
    STORE_TYPE CHARACTER VARYING(10),
    CITY CHARACTER VARYING(10)
);

我需要找到所有城市都存在的 store_type。所以我试图通过以下方式做到这一点。如果对于特定的, store_type(存在于Stores表中),我找不到任何store_type不存在的状态,那么这store_type就是我的答案。

我编写了以下查询并在 Netezza 中运行:

select distinct
    store_type
from
    stores
where
    not exists (
                    select *
                    from
                        cities
                    where
                        not exists (
                                        select *
                                        from
                                            cities_stores
                                        where
                                            cities_stores.city = cities.city
                                            and cities_stores.store_type = stores.store_type
                                    )
               );

但它给出了一个错误

错误:(2)不支持这种形式的相关查询 - 考虑重写

请告诉我哪里出错了。这与 Netezza 数据库有什么问题吗?

4

1 回答 1

0

一般来说,Netezza 中的相关子查询是个坏主意。有很多很好的资源表明了这一点。事实上,Netezza 会尝试为您确定等效的连接语法,而不是执行所写的语句。当它不能时,你会得到那个错误。

要绕过它,只需在第一次编写等效连接即可。

select distinct
  store_type
from
  stores str
  left outer join cities_stores cts using (store_type)
  left outer join cities cit using (city)
where
  city is null

注意:您说您想找到store_type所有城市中都存在的 ,但您的语句返回store_type的 s存在于任何城市中。我重写了您的 SQL,而不是您在问题中指出的内容。

于 2016-04-15T14:29:36.017 回答