0

複数の検索オプションを使用してから mySQL クエリに変換するクエリを実行しようとしています。myPHPadminでテストしているクエリは次のとおりです

SELECT Fname, Minit, Lname, Address, Hourly, Sname, Saddress, Dno
FROM (SELECT * 
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE EMPLOYEE.Dno = DEPARTMENT.Dnumber AND
LOCATION.Store_num = DEPARTMENT.Store_num AND
(Fname='100' OR Lname='100' 
OR LOCATION.Store_num ='100' OR Dno='100')) X

OR ステートメントはすべて「?」に変わります。mySQL では、今のところ Store_num でのみ機能する 100 を使用しています。これにより、その店舗で働く従業員のリストが表示されます。

しかし、私が得ているエラーは次のとおりです: #1060 - 列名 'Mgr_ssn' が重複しています

これが私のテーブルですが、なぜそれらが正しくマージされないのかわかりません。

CREATE TABLE EMPLOYEE
(   Fname       VARCHAR(15) not null,
    Minit       CHAR,
    Lname       VARCHAR(15) not null,
    Ssn         CHAR(9)     not null,
    Bdate       DATE,
    Address     VARCHAR(30), 
    Hourly      DECIMAL(5,2), 
    Mgr_ssn     CHAR(9),
    Dno         INT     not null,
    Start_date  DATE,
    Phone       CHAR(10),   
    PRIMARY KEY (Ssn),
    FOREIGN KEY (Mgr_ssn) REFERENCES EMPLOYEE(Ssn), 
    FOREIGN KEY (Dno) REFERENCES DEPARTMENT(Dnumber) );

CREATE TABLE DEPARTMENT
(   Dname       VARCHAR(15) not null,
    Dnumber     INT         not null,
    Mgr_ssn     CHAR(9)     not null,
    Mgr_start_date  DATE,
    Phone       CHAR(10),
    Store_num   INT     not null,
    PRIMARY KEY (Dnumber, Store_num),
    UNIQUE (Dname),
    FOREIGN KEY (Mgr_ssn) REFERENCES EMPLOYEE(Ssn),
    FOREIGN KEY (Store_num) REFERENCES LOCATION(Store_num) 
);

CREATE TABLE LOCATION
(   Store_num   INT         NOT NULL,
    Sname       VARCHAR(15)     NOT NULL, 
    Saddress    VARCHAR(30) NOT NULL,
    PRIMARY KEY (Store_num), 
    UNIQUE (Saddress)
);
4

2 に答える 2

1

問題はここにあります

SELECT *  FROM EMPLOYEE, DEPARTMENT, LOCATION

テーブルEMPLOYEEDEPARTMENT両方のMgr_ssn列があります。Mgr_ssn元のテーブルを指定する必要があります。

SELECT EMPLOYEE.Mgr_ssn AS `EMP_Mgr_ssn`,
       DEPARTMENT.Mgr_ssn AS `DEP_Mgr_ssn`,
       .....
FROM EMPLOYEE, DEPARTMENT, LOCATION

また、aliasそれを解決するのに役立ちます。

したがって、完全なクエリは次のようになります

SELECT Fname, Minit, Lname, Address, Hourly, Sname, Saddress, Dno
FROM 
(
    SELECT LOCATION.*,
           Employee.Mgr_ssn AS `EMP_Mgr_ssn`,
           DEPARTMENT.Mgr_ssn AS `DEP_Mgr_ssn`,
           Employee.Fname,
           Employee.Minit,
           Employee.Lname,
           Employee.Address,
           Employee.Hourly,Employee.Dno
    FROM EMPLOYEE, DEPARTMENT, LOCATION
    WHERE EMPLOYEE.Dno = DEPARTMENT.Dnumber AND
          LOCATION.Store_num = DEPARTMENT.Store_num AND
        (Fname='100' OR Lname='100' 
         OR LOCATION.Store_num ='100' OR Dno='100'
        )
) X

Mgr_ssnただし、列を作成しないため、このクエリも機能します

SELECT Fname, Minit, Lname, Address, Hourly, Sname, Saddress, Dno
FROM 
(
    SELECT LOCATION.*,
           Employee.Fname,
           Employee.Minit,
           Employee.Lname,
           Employee.Address,
           Employee.Hourly,Employee.Dno
    FROM EMPLOYEE, DEPARTMENT, LOCATION
    WHERE EMPLOYEE.Dno = DEPARTMENT.Dnumber AND
          LOCATION.Store_num = DEPARTMENT.Store_num AND
        (Fname='100' OR Lname='100' 
         OR LOCATION.Store_num ='100' OR Dno='100'
        )
) X
于 2012-11-26T05:20:41.070 に答える
0

テーブルの 2 つに「Mgr_ssn」列が含まれています。上記の問題を解決するには、次のクエリを使用して列のいずれかの名前を変更します

employee.Mgr_ssn を「give_any_name」として選択 .....

于 2012-11-26T05:21:16.927 に答える