具有多个条件的SQL QUERY JOIN

时间:2014-06-05 18:25:58

标签: mysql sql join

很抱歉这个问题,但我找不到解决这个简单问题的方法。

我有两张桌子:

TABLE A  
R_ID integer  
CID1 integer  
CID2 integer  
CID3 integer
CID4 integer 



TABLE C   
CID integer  
NAME varchar(50)  

我正在尝试做的是一个查询,它将为每个表格A行输出CID1CID2等名称,考虑到CID1总是一个值,CID2CID3CID4可能是NULL,我无法使用UNION并且在我的

这是我的出发点:

SELECT a.R_ID, c.NAME
FROM A a, C c
WHERE (a.CID1 = c.CID or a.CID2 = c.CID or a.CID3 = c.CID or a.CID4 = c.CID)

但正如您所看到的,只有在对所有CID进行评估时才有效,否则某些结果会有一个空白的NAME字段。

有关如何删除不需要的行的任何提示都将非常感激。

编辑: 我必须打印一个列表:房间# - 该房间中学生的姓名,因此输出的表格必须采用以下格式:R_IDNAME

假设:

TABLE A  
1,1,2,NULL,NULL  
2,3,NULL,NULL,NULL  
3,4,NULL,NULL,NULL

TABLE B  
1, Mark  
2, John  
3, Steve  
4, Nick  

我的目标是获得这样的表:

R_ID - NAME  
1 - Mark  
1 - John  
2 - Steve  
3 - Nick  

我得到的是:

1 - Mark  
1 - John  
1 -   
1 -   
2 - Steve  
2 -   
2 -   
2 -   
3 - Nick  
3 -   
3 -  
3 -   

4 LEFT JOIN的解决方案不适用,因为我不能使用NAME1,NAME2等,但只能使用1个字段NAME。

如下的查询:

SELECT r.R_ID, c.NAME 
FROM A a LEFT JOIN C c on a.CID1 = c.CID
LEFT JOIN C as c1 on a.CID2 = c1.CID
LEFT JOIN C as c2 on a.CID3 = c2.CID
LEFT JOIN C as c3 on a.CID4 = c3.CID  

将输出:

1 - Mark
2 - Steve
3 - Nick  

解决方案NAME is not NULL在SQLFiddle上完美运行,但仍然在我的mysql 5.5.15上显示没有名称的行(也在firebird 2.5上尝试过,这是我电脑上唯一的其他数据库服务器,但是相同的结果)

2 个答案:

答案 0 :(得分:2)

TableA中的每个CID列需要3个单独的连接。

SELECT
  R_ID,

  c1.Name As CID1Name,
  c2.Name As CID2Name,
  c3.Name As CID3Name
FROM
  TableA a
  LEFT JOIN TableC c1 ON a.CID1 = c1.CID
  LEFT JOIN TableC c2 ON a.CID2 = c2.CID
  LEFT JOIN TableC c3 ON a.CID3 = c3.CID

答案 1 :(得分:1)

您的查询会返回每个cid值的名称,请参阅SQLFiddle

可能存在的问题是NULL列中的空或name条目,请参阅SQLFiddle

您可以使用表ac上的简单联接以及其他where子句来解决此问题

select a.r_id, c.name
from a
join c on c.cid in (a.cid1, a.cid2, a.cid3, a.cid4)
where c.name is not null

SQLFiddle

当然,您可以通过添加相同的子句

来实现与隐式连接相同的操作
SELECT a.R_ID, c.NAME
FROM A a, C c
WHERE (a.CID1 = c.CID or a.CID2 = c.CID or a.CID3 = c.CID or a.CID4 = c.CID)
      and c.name is not null

SQLFiddle

如果您有空字符串而不是NULL值,则可以将name包裹在trim中以应对空格

and trim(c.name) <> ''