Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 - Fatal编程技术网

Sql 如果有任何类似条件的值,请选择所有值

Sql 如果有任何类似条件的值,请选择所有值,sql,postgresql,Sql,Postgresql,我有三张桌子: 公司: ____________________________________________________________ | id | company | ____________________________________________________________ | 1 | 'Sunflower'

我有三张桌子:

公司:

____________________________________________________________
|           id                |           company          |
____________________________________________________________
|            1                |         'Sunflower'        |
___________________________________________________________
|            2                |         'Chamomile'        |
____________________________________________________________
服务公司

____________________________________________________________
|         company             |           service          |
____________________________________________________________
|            1                |              1             |
___________________________________________________________
|            1                |              2             |
____________________________________________________________
|            2                |              1             |
____________________________________________________________
服务

____________________________________________________________
|           id                |            service         |
____________________________________________________________
|            1                |           'sales'          |
___________________________________________________________
|            2                |         'distribution'     |
____________________________________________________________
DDL SQL:

CREATE TABLE companies ("id" int, "company" varchar(9));
INSERT INTO companies ("id", "company") VALUES (1, 'Sunflower'),(2, 'Chamomile');

CREATE TABLE companies_services ("company" int, "service" int);
INSERT INTO companies_services  ("company", "service")VALUES    (1, 1), (1, 2), (2, 1);

CREATE TABLE services   ("id" int, "service" varchar(12));
INSERT INTO services    ("id", "service")VALUES (1, 'sales'),   (2, 'distribution');
和查询:

SELECT companies.company 
       services.service
FROM companies
LEFT JOIN companies_services ON comapnies.company = companies_services.company
INNER JOIN services ON companies_services.service = services.service
WHERE services.service LIKE '%distr%' 
通过这个查询,我只得到了“分发”服务,但公司可能包含更多的服务,我也需要选择它们。如何检查公司是否包含服务,如%value%,然后选择所有服务,否则不选择

结果一定是这样的

____________________________________________________________
|           company           |            service         |
____________________________________________________________
|         'Sunflower'         |            'sales'         |
___________________________________________________________
|         'Sunflower'         |           'distribution'   |
____________________________________________________________
试试看:

with CTE as (
    select company from companies_services T1
    left join services T2 on T1.service = T2.ID
    where T2.service like '%distr%' 
)
select T3.company,T2.service from companies_services T1
left join services T2 on T1.service = T2.id
left join companies T3 on T1.company = T3.id
where T1.company in (select company from CTE)

结果:

CREATE TABLE companies ("id" int, "company" varchar(9));
INSERT INTO companies ("id", "company") VALUES (1, 'Sunflower'),(2, 'Chamomile');

CREATE TABLE companies_services ("company" int, "service" int);
INSERT INTO companies_services  ("company", "service")VALUES    (1, 1), (1, 2), (2, 1);

CREATE TABLE services   ("id" int, "service" varchar(12));
INSERT INTO services    ("id", "service")VALUES (1, 'sales'),   (2, 'distribution');


试试看:

with CTE as (
    select company from companies_services T1
    left join services T2 on T1.service = T2.ID
    where T2.service like '%distr%' 
)
select T3.company,T2.service from companies_services T1
left join services T2 on T1.service = T2.id
left join companies T3 on T1.company = T3.id
where T1.company in (select company from CTE)

结果:

CREATE TABLE companies ("id" int, "company" varchar(9));
INSERT INTO companies ("id", "company") VALUES (1, 'Sunflower'),(2, 'Chamomile');

CREATE TABLE companies_services ("company" int, "service" int);
INSERT INTO companies_services  ("company", "service")VALUES    (1, 1), (1, 2), (2, 1);

CREATE TABLE services   ("id" int, "service" varchar(12));
INSERT INTO services    ("id", "service")VALUES (1, 'sales'),   (2, 'distribution');



根据您的数据,我认为您不需要左键加入。这里是查询>>

SELECT c.company,
       s.service
FROM   companies AS c
       INNER JOIN companies_services AS cs
              ON c.id = cs.company
       INNER JOIN services AS s
               ON cs.service = s.id
WHERE  c.id IN (SELECT c1.id
                FROM   companies AS c1
                       INNER JOIN companies_services AS cs1
                              ON c1.id = cs1.company
                       INNER JOIN services AS s1
                               ON cs1.service = s1.id
                              AND s1.service LIKE '%distr%'); 

根据你的数据,我看你不需要左键连接。这里是查询>>

SELECT c.company,
       s.service
FROM   companies AS c
       INNER JOIN companies_services AS cs
              ON c.id = cs.company
       INNER JOIN services AS s
               ON cs.service = s.id
WHERE  c.id IN (SELECT c1.id
                FROM   companies AS c1
                       INNER JOIN companies_services AS cs1
                              ON c1.id = cs1.company
                       INNER JOIN services AS s1
                               ON cs1.service = s1.id
                              AND s1.service LIKE '%distr%'); 
这也有效:

select companies.company, services.service  from companies
inner join (select companies_services.company from services 
            inner join companies_services on companies_services.service=services.id 
            where services.service like '%distr%') as company_id on company_id.company=companies.id
inner join companies_services on companies_services.company = companies.id
inner join services on services.id = companies_services.service
这也有效:

select companies.company, services.service  from companies
inner join (select companies_services.company from services 
            inner join companies_services on companies_services.service=services.id 
            where services.service like '%distr%') as company_id on company_id.company=companies.id
inner join companies_services on companies_services.company = companies.id
inner join services on services.id = companies_services.service

如果将服务放在一个列中,那么这很容易:

SELECT c.company, ARRAY_AGG(cs.service) as services
FROM companies c JOIN
     companies_services cs
     ON c.company = cs.company 
GROUP BY c.company
HAVING SUM( (cs.service LIKE '%distr%')::int ) > 0 ;
注:

  • 不需要
    服务
    表,因为所需的列位于
    公司服务
  • 不需要外部联接,因为您需要匹配
  • 表别名使查询更易于读取和写入
如果您想单独使用,则窗口功能是一种选择:

SELECT company, service
FROM (SELECT c.company, cs.service,
              SUM( (cs.service LIKE '%distr%')::int ) OVER (PARTITION BY c.company) as cnt
      FROM companies c JOIN
           companies_services cs
           ON c.company = cs.company 
     ) c
WHERE cnt > 0;

如果将服务放在一个列中,那么这很容易:

SELECT c.company, ARRAY_AGG(cs.service) as services
FROM companies c JOIN
     companies_services cs
     ON c.company = cs.company 
GROUP BY c.company
HAVING SUM( (cs.service LIKE '%distr%')::int ) > 0 ;
注:

  • 不需要
    服务
    表,因为所需的列位于
    公司服务
  • 不需要外部联接,因为您需要匹配
  • 表别名使查询更易于读取和写入
如果您想单独使用,则窗口功能是一种选择:

SELECT company, service
FROM (SELECT c.company, cs.service,
              SUM( (cs.service LIKE '%distr%')::int ) OVER (PARTITION BY c.company) as cnt
      FROM companies c JOIN
           companies_services cs
           ON c.company = cs.company 
     ) c
WHERE cnt > 0;

WHERE子句条件使第二个左连接返回常规内部连接结果。WHERE子句条件使第二个左连接返回常规内部连接结果。不是这样。我将预期结果添加到问题中,然后修复它@Simatsuedgeworth不是这样的。我将预期结果添加到问题中,然后修复它@这个解决方案比必要的复杂得多。这个解决方案比必要的复杂得多。