我目前正在为我正在合作的公司开发数据库软件。我将这些表格从Len Silverston的书中删除,因为我发现它是基于数据建模的信息的绝佳来源。
现在,你不需要熟悉他的书来了解我的问题的解决方案,但我想不出任何其他方式来说出我的标题。
假设我有两个表,人物和 Person_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 |
-----------------------------------------------------------------------
感谢您抽出宝贵时间阅读我的问题!
答案 0 :(得分:0)
很容易。我不知道这本书,但可能它包含一些描述表连接的材料及其在查询中的应用:
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 JOIN
s'ON
子句条件将完全排除这些行。