3

これに関連する2つの表があります。Workonと従業員。これらの2つのテーブルの内容は、従業員のEMPID NAME SALARY DID(部門ID)と作業中のPIDEMPIDHOURSです。私が書いたSQLは

select e.name, w.pid
from employee e, workon w
where e.empid = w.empid
group by e.name, w.pid, w.empid
having count (e.name) > 1
order by w.pid

私は、このコードが複数のプロジェクトに取り組む従業員を私に与えない理由を理解しようとしています。私が間違っていることを理解するのを手伝ってください。

4

3 に答える 3

3

あなたのグループは、プロジェクトごとに従業員ごとに1行を返していました。定義上、これは1行を超えることはできません。

以下のSQLが機能するはずです

警告:これがサーバー使用のパフォーマンスにどのように影響するかは、ご自身の責任でわかりません。

以下は、ワークオンごとに従業員ごとに1行を返しますが、複数のワークオンレコードを持つ従業員に制限されます(したがって、従業員が5つのワークオンレコードを持っている場合、同じe.nameと5つの異なるw.pid値を持つ5つの行を取得します)

select e.name, w.pid
from employee e, workon w
where e.empid = w.empid
and e.empid in (
select w.empid
from workon w -- there was a typo here originally
group by 1
having count (*) > 1
)
order by e.name, w.pid
于 2012-11-14T20:50:34.927 に答える
1
SELECT E.NAME, W.PID
from employee e inner join workon w on e.empid = w.empid
where e.empid in (select EMPID from workon GROUP BY EMPID HAVING COUNT(EMPID) > 1)

サブクエリは、そのempidが複数のプロジェクトに関連付けられているすべてのレコードをカウントし、メインクエリは、empidテーブルのempidがサブクエリの結果に含まれているかどうかを確認します。

于 2012-11-14T22:48:29.053 に答える
0

以下のクエリでこれを試すことができます。

ここでは、変数内のすべての個別のカウント部門が部門マスターテーブルから取得されています。その後、カウントがリレーションテーブルの個別のリンクされた部門カウントと一致する従業員のみが選択されました。

CREATE TABLE employees
(
    employee_id int NOT NULL CONSTRAINT pk_employees PRIMARY KEY,
    employee_name nvarchar(128) NOT NULL CONSTRAINT uk_employees_employee_name UNIQUE
);

CREATE TABLE departments
(
    department_id int NOT NULL PRIMARY KEY,
    department_name nvarchar(128) NOT NULL CONSTRAINT uk_departments_department_name UNIQUE
);

CREATE TABLE department_employees
(
    department_id int NOT NULL CONSTRAINT fk_department_employees_departments REFERENCES departments(department_id),
    employee_id int NOT NULL CONSTRAINT fk_departement_employees_employees REFERENCES employees(employee_id),
    CONSTRAINT pk_deparment_employees PRIMARY KEY (department_id, employee_id)
)

INSERT INTO employees
VALUES (1, 'John Doe'), (2, 'Jane Doe'), (3, 'William Doe'), (4, 'Margaret Doe')

INSERT INTO departments
VALUES (1, 'Accounting'), (2, 'Humman Resources'), (3, 'Marketing')

INSERT INTO department_employees
VALUES 
    (1, 1), (2, 1), (3, 1), 
    (2, 2), (2, 3),
    (3, 3), (3, 4)

declare @distinctDeptCount int 
SET @DistinctDeptCount = (SELECT Count(Distinct department_id) FROM departments)
--SELECT @DistinctDeptCount

SELECT Distinct employees.employee_id, employee_name
from employees     
where employees.employee_id in (
select employee_id from department_employees GROUP BY employee_id HAVING COUNT(department_id) >= @distinctDeptCount
)

これがライブデモEmpです。すべての部門で 出力は次のようになります

employee_id employee_name
1           John Doe
于 2018-12-13T10:51:13.963 に答える