0

私はテーブルを持っています

Employees
id
name 

Services
id
name

EmployeesServices
id_employee
id_service

作ったらわかる

select * from Employees inner join EmployeesServices on Employees.id = EmployessServices.Employee_id

編集: AEmployeeServicesには多くのServicesとがありEmployeesます。それぞれEmployeeに少なくとも 1 つずつ存在する があるかどうかを知る必要がありますEmployeeServicesServices

混乱して申し訳ありませんが、難しいようです

4

4 に答える 4

1

あなたが求めていることを理解しているかどうかは完全にはわかりません。あなたが求めていることを理解しているかどうかも完全にはわかりませんが、SQL クエリを理解しようとしている場合、それは珍しいことではありません。

あなたが持っていると仮定すると

  • Services.id の主キー制約、および
  • EmployeesServices(id_employee, id_service) の主キー制約

これにより、すべてのサービスを「持っている」すべての従業員が返されます。(PostgreSQL でテスト済み。)

select id_employee, count(id_employee)
from EmployeesServices
group by id_employee
having count(id_employee) = (select count(*) from Services)

EmployeesServices に重複する行があってはなりません。したがって、従業員がすべてのサービスを「利用」するには、従業員 ID 番号 (従業員 ID 番号でグループ化) の数がサービスの数と一致する必要があります。

于 2013-03-10T03:40:32.497 に答える
1

id_serviceinごとに個別の をカウントid_employeeEmployeesServicesます。

SELECT
  id_employee,
  COUNT(DISTINCT id_service) AS service_count
FROM
  EmployeesServices
GROUP BY
  id_employee
;

ここで、値をフィルタリングする必要がありservice_countます。その式には集計関数が含まれているため、句を使用する必要があります。これは、行グループHAVINGをフィルター処理するために使用されるためです(個々の行とは対照的に)。WHERE

私が理解しているように、条件は「従業員ごとの個別のサービスの数は、サービステーブル内のサービスの数と同じです」である必要があります。それで、ここに行きます:

SELECT
  id_employee,
  COUNT(DISTINCT id_service) AS service_count
FROM
  EmployeesServices
GROUP BY
  id_employee
HAVING
  COUNT(DISTINCT id_service) = (SELECT COUNT(*) FROM Services)
;

これで、条件に一致する従業員の ID のみが得られます。クエリを派生テーブルとして使用し、それを結合してEmployee従業員の詳細にアクセスします。

SELECT
  e.*,
  es.service_count
FROM
  Employee e
INNER JOIN (
  SELECT
    id_employee,
    COUNT(DISTINCT id_service) AS service_count
  FROM
    EmployeesServices
  GROUP BY
    id_employee
  HAVING
    COUNT(DISTINCT id_service) = (SELECT COUNT(*) FROM Services)
) es
ON
  e.id = es.id_employee
;

EmployeeServicesが従業員ごとに重複するサービスを受け入れない場合は、 に置き換えることができることに注意してCOUNT(DISTINCT id_service)くださいCOUNT(*)

于 2013-03-10T03:42:36.643 に答える
0

このクエリは、すべてのサービスに参加しているすべての従業員のIDを返します。

SELECT es.id_employee 
FROM
(SELECT e.id as emp_id, s.id as serv_id FROM Employee e CROSS JOIN Service s) as full
LEFT JOIN EmployeeServices es ON es.id_employee=full.emp_id AND es.id_service=full.serv_id
GROUP BY full.emp_id
HAVING COUNT(*)=COUNT(es.id_employee);

SQLフィドル-データを試してみることをお勧めします

于 2013-03-10T03:10:57.303 に答える
0
    create table Employees (id number unique, name text);
    create table Services (Sid number unique, Sname text);
    create table EmployeesServices (EEid number, ESid number);
    insert into Employees values (1, 'bob');
    insert into Employees values (2, 'joan');
    insert into Employees values (3, 'philippe');
    insert into Services values (100, 'fell tree');
    insert into Services values (101, 'row boat');
    insert into Services values (102, 'read book');
    insert into Services values (103, 'sell book');
    insert into Services values (104, 'sell ticket');
    insert into EmployeesServices values (1, 100);
    insert into EmployeesServices values (2, 101);
    insert into EmployeesServices values (2, 101);
    insert into EmployeesServices values (3, 101);
    insert into EmployeesServices values (3, 103);
    insert into EmployeesServices values (3, 103);
    insert into EmployeesServices values (3, 104);
    insert into EmployeesServices values (1, 100);
    insert into EmployeesServices values (1, 101);
    insert into EmployeesServices values (1, 102);
    insert into EmployeesServices values (1, 102);
    insert into EmployeesServices values (1, 102);
    insert into EmployeesServices values (1, 102);
    select count(*) as Number_of_Unique_Services_Available from Services;
    select id, name, count(distinct Sid) as Unique_Services_Performed
    from Employees, Services, EmployeesServices
    where id = EEid and Sid = ESid
    group by id
    order by Unique_Services_Performed desc, name;

テスト用にいくつかのテーブルを作成しました。従業員は同じサービスを複数回実行できると想定しています。最初の select ステートメントは、利用可能な一意のサービスの数を示します。2 つ目は、各従業員が実行した一意のサービスの数を示す出力を作成します。以下のサンプル出力は、5 つの固有のサービスを示しており、そのすべてを実行した人はいません。

    Number_of_Unique_Services_Available
    -----------------------------------
    5

    id          name        Unique_Services_Performed
    ----------  ----------  -------------------------
    1           bob         3
    3           philippe    3
    2           joan        1
于 2013-03-10T06:25:43.970 に答える