2012-04-09 81 views
0

选择一些价值观,我有我的数据库结构这样的:插入表,该表是从其他表

数据库结构::

  • ​​
  • Product_table - Product_ID(PK), Product_name
  • Project_Table- Project_ID(PK), Project_Name
  • Environment_Table- Env_ID(PK), Env_Name
  • Employee_Table- Employee_ID(PK), Name
  • Employee_Product_projectMapping_Table -Emp_ID(FK), Project_ID(FK), Product_ID(FK)
  • Product_EnvMapping_Table - Product_ID(FK), Env_ID(FK)

我想在ATT_Table插入值。现在在这张表中,我有一些列,如assignedtoID,assignedbyID,envID,ProductID,project_ID,它们在这个表中是FK,但是在其它表中是主键,它们只是数字)。

现在,当我从用户输入数据我正在在字符串的形式等用户输入NameEmployee_Table),product_NameProduct_table),而不是直接ID。所以我想首先让用户输入(的EmployeeproductProjectEnv)的名称,然后它的主键(Emp_ID, product_ID, project_ID, Env_ID)的价值被拾起,然后将它们插入到ATT_table代替assignedtoID, assignedbyID, envID, ProductID, project_ID

请注意assignedtoID, assignedbyID参考在Employee_Table

如何做到这一点?我有这样的东西,但它不工作::

INSERT INTO ATT_TABLE(Assigned_To_ID,Assigned_By_ID,Env_ID,Product_ID,Project_ID) 
VALUES (A, B, Env_Table.Env_ID, Product_Table.Product_ID, Project_Table.Project_ID) 
SELECT Employee_Table.Emp_ID AS A,Employee_Table.Emp_ID AS B, Env_Table.Env_ID, Project_Table.Project_ID, Product_Table.Product_ID 
FROM Employee_Table, Env_Table, Product_Table, Project_Table 
WHERE Employee_Table.F_Name= "Shantanu" or Employee_Table.F_Name= "Kapil" or Env_Table.Env_Name= "SAT11A" or Product_Table.Product_Name = "ABC" or Project_Table.Project_Name = "Project1"; 

回答

1

请使用,而不是OR

INSERT INTO ATT_TABLE(Assigned_To_ID,Assigned_By_ID,Env_ID,Product_ID,Project_ID) 
    SELECT A.Emp_ID, B.Emp_ID, Env_Table.Env_ID, Project_Table.Project_ID, Product_Table.Product_ID 
    FROM Employee_Table A, Employee_Table B, Env_Table, Product_Table, Project_Table 
    WHERE A.F_Name= "Shantanu" 
     AND B.F_Name= "Kapil" 
     AND Env_Table.Env_Name= "SAT11A" 
     AND Product_Table.Product_Name = "ABC" 
     AND Project_Table.Project_Name = "Project1"; 

但是,最好的做法是在您的场景中使用下拉列表,我猜。

+0

它不断给我错误插入;在SQL语句的末尾。我想它会在插入值的地方结束。当我插入值后;并运行它。它给了我之后找到的错误文本;这是显而易见的。早些时候,我也得到了同样的东西。它没有得到SELECT语句。谢谢.. – 2012-04-09 10:37:33

+0

我已更新我的代码。请看现在。 – sarwar026 2012-04-09 10:38:19

+0

给我...你即将追加(0)行...没有数据被添加..我认为我们需要有那个VALUES部分... – 2012-04-09 10:41:49

2

这样处理的方式是通过使用下拉选择列表。该列表由(至少)两列构成:一个持有Id的数据库,另一个存储用户看到的字符串。像

1, "CA", "Canada" 
2, "USA", 'United States" 
... 

用户看到

CA | Canada 
USA| United States 
... 

是被存储在数据库中的1,2,...无论行的用户选择的值。

你永远不能依赖用户的确切,正确的输入。迟早他们会犯错字。


我根据您的评论扩展我的答案。

给定解决方案的问题(通过将输入文本连接到所有父表,并将其与多个AND组合在一起从父表中获取Id)是一旦给定参数有错字,你将不会收到任何单曲。想象一下当员工的实际F_name是“Shant * anu *”并且用户输入“Shant * aun *”时的后果。

解决这个问题的最好方法是从父表中逐个获取这些Id。假设一些FK具有NOT NULL约束。您可以检查是否填写了F_name,并在用户未填写该字段时通知用户。假设用户名为“Shant * aun *”作为名称,程序不会警告用户,因为某些内容会被填充。但这不是数据库将执行的检查,因为NOT NULL约束在Id (FK)。当你从父表中一个一个地得到Id时,你可以验证它们是否不是NULL。当填写文本时,如“Shant * aun *”,但返回的Id为NULL,则可以通知用户一个问题并让他纠正他的输入:“没有名称为'Shantaun'的员工可能是找到。”

SELECT $Emp_ID_A = Emp_ID 
FROM Employee_Table 
WHERE F_Name= "Shantanu" 

SELECT $Emp_ID_B = Emp_ID 
FROM Employee_Table 
WHERE B.F_Name= "Kapil" 

SELECT $Env_ID = Env_ID 
FROM Env_Table 
WHERE Env_Table.Env_Name= "SAT11A" 

SELECT $Product_ID = Product_ID 
FROM Product_Table 
WHERE Product_Table.Product_Name = "ABC" 

SELECT $Project_ID = Project_ID 
FROM Project_Table 
WHERE Project_Name = "Project1" 
+0

我知道你是对的..这是更可取的方法..但我需要在ATT_table中具有该ID值...难道我不能问什么?我们可以这样做吗?? – 2012-04-09 10:45:56