2011-05-02 42 views
0

我是SQL编程的新手,并且有点麻烦。我有以下MySQL的脚本:有条件的NULL列的MySQL SELECT

SELECT 
    MyPrimaryTable.PrimaryKey, Alias1.String AS Output1, 
    CASE 
     WHEN Id2 IS NOT NULL THEN Alias2.String 
     ELSE "" 
    END AS Output2 
FROM MyPrimaryTable, MySecondaryTable AS Alias1, MySecondaryTable AS Alias2 
WHERE 
    MyPrimaryTable.Id1 = Alias1.Id1 
    AND ((MyPrimaryTable.Id2 IS NULL) OR (MyPrimaryTable.Id2 = Alias2.Id2)); 

基本上,我有一个包含两个ID,ID1和ID2一个主表,和我想这些ID的每一个用细绳在二次表及关联在SELECT结果中显示这些字符串。但是,主表中的第二个ID允许为NULL。在这种情况下,我希望的输出是预期的第一个字符串,第二个字符串为空(“”)。我写的脚本是这样做的,只是它为每个可能的字符串添加了一个新行,尽管所有行看起来都是一样的。

预期结果有可能的字符串Foo1和Foo2,Foo3和Foo4,与表中的两个条目:

PK Output1 Output2 
1 Foo1 Foo4 
2 Foo2 

我得到什么:

1 Foo1 Foo4 
2 Foo2 
2 Foo2 
2 Foo2 

如何清洁这并让它按预期工作?谢谢。

编辑:我希望不要使用DISTINCT,因为我想在VIEW中使用它,而DISTINCT将使视图不可更新。

+0

你有没有考虑GROUP_CONCAT()? http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat – 2011-05-02 08:23:08

回答

1

尝试

GROUP BY MyPrimaryTable.PrimaryKey 

在另一端分组,您可以加入表中没有与WHERE

SELECT 
    MyPrimaryTable.PrimaryKey, 
    Alias1.String AS Output1, 
    CASE 
     WHEN Id2 IS NOT NULL THEN Alias2.String 
     ELSE "" 
    END AS Output2 
FROM MyPrimaryTable, 
    LEFT JOIN MySecondaryTable AS Alias1 ON MyPrimaryTable.Id1 = Alias1.Id1 
    LEFT JOIN MySecondaryTable AS Alias2 ON MyPrimaryTable.Id2 = Alias2.Id2 
+0

谢谢! LEFT JOIN正是我所期待的。 – RawwrBag 2011-05-02 09:22:29

+0

不幸的是,这似乎并没有正确更新时使用的视图,IE浏览器,如果我尝试'更新Output1 SET String =“测试”WHERE PrimaryKey = 1234'它似乎用“测试”替换原始字符串的所有实例,而不是就在PK是1234的地方。离开你的头顶,你知道这可能是为什么吗? – RawwrBag 2011-05-02 09:45:07

+0

没关系,忽略最后一条评论,我很笨 - 我不得不编辑原始数字,而不是相关的字符串。 Durp。 – RawwrBag 2011-05-02 09:46:28