IF ELSE语句加入表sql

时间:2013-03-19 18:22:14

标签: mysql sql if-statement inner-join

我有一个超类型表,我必须从2个子类型a,b中选择1个子类型表。一个子类型不能与另一个子类型一起使用,所以对于我来说,我必须检查是否在其中一个子类型中包含了超类型ID。我一直在做实验查询,但无法做到正确。

这就是我想到的:

SELECT * from supertypetable INNER JOIN 
IF  (a.id = given.id) then a ON a.id = supertypetable.id
ELSE  b ON b.id = supertetable.id

job Table
________________________________
|job_id| blach2x....
________________________________
|    1  |
|    2  |
|    3  |
________________________________

partime Table
________________________________
|job_id| blach2x....
________________________________
|    2  |
|    3  |
________________________________

fulltime Table
________________________________
|job_id| blach2x....
________________________________
|    1  |
|       |
________________________________

我想加入满足我给定ID的表

3 个答案:

答案 0 :(得分:0)

这看起来很像rails / activerecord中的多态连接。它在那里实施的方式,超级类型' table有两个字段:subtype_id和subtype_type。 subtype_type表有一个字符串,可以很容易地变成右子类型表的名称; subtype_id具有该表中行的id。像这样构建表可能会有所帮助。

您需要问的下一个问题是您希望在结果中看到什么?如果你想看到超类型表和所有的子类型表,你可能需要一次加入一个,然后将它们组合在一起。换句话说,首先只针对其中一个子类型表,然后针对下一个子表,等等。如果这不是你想要的,也许你可以进一步澄清你的问题。

答案 1 :(得分:0)

如果a.id永远不能等于b.id你可以在两个表上进行连接然后再做一个UNION,只有id匹配的表会返回结果:

SELECT * from supertypetable 
INNER JOIN 
a ON a.id = supertypetable.id
UNION
SELECT * from supertypetable 
INNER JOIN 
b ON b.id = supertypetable.id

如果a.id可以等于b.id,那么这将不起作用。但这是一个想法

评估每条评论: 这种方法仅在a和b的结构相同时才有效。

答案 2 :(得分:0)

所以一个简单的建议可能只是:

   SELECT * FROM job
    left join parttime on parttime.job_id = job.job_id
    left join fulltime on fulltime.job_id = job.job_id
where job.job_id = @job_id

然后让你的应用程序找出两个连接表中的哪一个没有NULL数据并显示它。

如果您不介意不一致的数据集并且总是想要正确的返回集(尽管您仍然需要某种应用程序逻辑,因为正如您所说,兼职和完整时间的结构是不同的,所以如何你是否会在没有某种检查的情况下有条件地显示/利用他们的数据?如果你要做那个检查,你也可以预先做好,找出你给定的job_id子类型是什么,然后只是选择适当的查询在那里运行。)

抱歉!题外话!

存储过程可以为您执行此逻辑(删除所有连接,只是一个示例):

CREATE PROCEDURE getSubTypeDATA (@job_id int)
BEGIN

IF (SELECT EXISTS(SELECT 1 FROM parttime WHERE job_id = @job_id)) = 1
BEGIN
SELECT * from parttime
END
ELSE
BEGIN
SELECT * from fulltime
END

END

或者,如果您需要一致的数据集(适用于应用程序逻辑),为什么不将公共列在fulltime和parttime之间放入UNION语句中,并为它们不共享的列创建硬编码的NULL。例如,如果fullTime看起来像

EmployeeID,DepartmentID,Salary

和partTime看起来像

EmployeeID,DepartmentID,HourlyRate

你可以做到

SELECT job.*, employeeid, departmentid, salary, null as hourlyrate FROM job inner join fulltime on fulltime.job_id = job.job_id
where job.job_id = ?
union
  SELECT job.*, employeeid, departmentid, null as salary, hourlyrate FROM job inner join parttime on parttime.job_id = job.job_id
where job.job_id = ?

如果有100个不同的列,这可能很难处理。此外,如果这没有显而易见,具有完全不同结构但使用相同外键的子类型是一个非常好的线索,你正在打破第三范式。