很抱歉这个问题,但我找不到解决这个简单问题的方法。
我有两张桌子:
TABLE A
R_ID integer
CID1 integer
CID2 integer
CID3 integer
CID4 integer
TABLE C
CID integer
NAME varchar(50)
我正在尝试做的是一个查询,它将为每个表格A行输出CID1
,CID2
等名称,考虑到CID1
总是一个值,CID2
,CID3
和CID4
可能是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_ID
,NAME
假设:
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上尝试过,这是我电脑上唯一的其他数据库服务器,但是相同的结果)
答案 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
您可以使用表a
和c
上的简单联接以及其他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
当然,您可以通过添加相同的子句
来实现与隐式连接相同的操作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
如果您有空字符串而不是NULL
值,则可以将name
包裹在trim
中以应对空格
and trim(c.name) <> ''