1

我目前正在为与我合作的公司开发数据库软件。我以 Len Silverston 的书为基础,因为我发现它是基于数据建模的信息的极好来源。

现在,你不需要熟悉他的书就能知道我的问题的解决方案,但我想不出任何其他方式来形容我的标题。

假设我有两个表,PersonsPerson_Names

CREATE TABLE Persons
(
 party_id    INT    PRIMARY KEY,
 birth_date  DATE,
 social      VARCHAR(20)
);

CREATE TABLE Person_Names
(
 party_id    INT,
 name_id     INT,
 person_name VARCHAR(20),

 CONSTRAINT person_names_cpk
    PRIMARY KEY (party_id, name_id)
);

这两个表可以通过party_id 连接。此外,在Person_Names下,name_id = 1与人的名字(存储在字段person_name中)相关,而name_id = 2是人的姓氏

* 编辑 * 有人要求提供一些数据,所以我将在下面添加一些数据:

INSERT INTO Persons VALUES
 (1, '01-01-1981', '111-11-1111'),
 (2, '02-02-1982', '222-22-2222'),
 (3, '03-03-1983', '333-33-3333');

INSERT INTO Person_Names VALUES
 (1, 1, 'Kobe'),
 (1, 2, 'Bryant'),
 (2, 1, 'LeBron'),
 (2, 2, 'James'),
 (3, 1, 'Kevin'),
 (3, 2, 'Durant');

现在我添加了这些数据,我将如何查询以下内容?

-----------------------------------------------------------------------
| Party Id  |  First Name  |  Last Name  |  Birthdate  |  Social No.  |
-----------------------------------------------------------------------
|     1     |    Kobe      |   Bryant    |  01-01-1981 |  111-11-1111 | 
|     2     |    LeBron    |   James     |  02-02-1982 |  222-22-2222 |
|     3     |    Kevin     |   Durant    |  03-03-1983 |  333-33-3333 |  
-----------------------------------------------------------------------

感谢您花时间阅读我的问题!

4

1 回答 1

1

很容易。我不知道这本书,但大概它包含一些描述表连接及其在查询中的应用的材料,例如:

SELECT Persons.party_id AS "Party Id",
    firstname.person_name AS "First Name",
    lastname.person_name AS "Last Name",
    Persons.birth_date AS "Birthdate",
    Persons.social AS "Social No."
FROM Persons
    INNER JOIN Person_Names firstname 
        ON Persons.party_id = firstname.party_id
        AND firstname.name_id = 1
    INNER JOIN Person_Names lastname
        ON Persons.party_id = lastname.party_id
        AND lastname.name_id = 2

请注意,这只会为那些在您的 Person_Names 表中定义了名字和姓氏的人返回结果;如果其中一个不存在,则INNER JOINs'ON子句条件将完全排除这些行。

于 2013-11-14T01:48:13.467 回答