请检查SQL模式并查询SQL Fiddle
如果有人能解决问题,我会得到带有NULL值的重复记录.
问候
这就是我得到的:
| MEM_ID | MEM_EMAIL | GENDER | EDUCATION | PROFESSION |
|--------|----------------|--------|-----------|-------------|
| 1 | it@email.com | Male | (null) | (null) |
| 1 | it@email.com | (null) | Graduate | (null) |
| 1 | it@email.com | (null) | (null) | Engineer |
| 2 | info@email.com | Female | (null) | (null) |
| 2 | info@email.com | (null) | Graduate | (null) |
| 2 | info@email.com | (null) | (null) | Not Working |
Run Code Online (Sandbox Code Playgroud)
但是我需要
| MEM_ID | MEM_EMAIL | GENDER | EDUCATION | PROFESSION |
|--------|----------------|--------|-----------|-------------|
| 1 | it@email.com | Male | Graduate | Engineer |
| 2 | info@email.com | Female | Graduate | Not Working |
Run Code Online (Sandbox Code Playgroud)
|
是的,着名的内部平台效应,您尝试通过创建"属性 - 值"表并为数据类型和值分配魔术字符串来实现关系,然后尝试在运行时检索具有大量自连接的值.
这条道路上只有疯狂.SQL已包含用于实施键值和参照完整性的功能; 不要试图自己实现这一点.这特别令人沮丧,因为您的架构实际上非常简单:
CREATE TABLE [dbo].Member(
ID INT PRIMARY KEY,
Email Varchar(50) NOT NULL,
GenderID INT NOT NULL,
EducationID INT,
ProfessionID INT
)
CREATE TABLE [dbo].Gender(
GenderID INT PRIMARY KEY,
GenderName Varchar(50) NOT NULL
)
CREATE TABLE [dbo].Education(
EducationID INT PRIMARY KEY,
EducationName Varchar(50) NOT NULL
)
CREATE TABLE [dbo].Profession(
ProfessionID INT PRIMARY KEY,
ProfessionName Varchar(50) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
将您的魔术值分配给Gender,Education和Profession行,并将其ID分配给Member.您可以使用简单的方法执行完整查找:
SELECT ID, Email, GenderName, EducationName, ProfessionName
FROM Member m
JOIN Gender g ON g.GenderID=m.GenderID
LEFT JOIN Education e ON e.EducationID=m.EducationID
LEFT JOIN Profession p ON p.ProfessionID=m.ProfessionID
WHERE ...
Run Code Online (Sandbox Code Playgroud)
你想强制执行价值观?制作Member专栏NOT NULL.比方说,只允许Education每个成员每行的一个实例?外键约束已经支持这一点,无需创建自己的查询语言.