SQL在同一个字段上帮助不同的值

时间:2015-02-19 16:04:34

标签: sql oracle

我需要帮助。 我有两张桌子:ADDRESSCUSTOM 我可以用ADDRESS.ID = CUSTOM.ADDRESSID链接这两个表 我想选择CUSTOM.NAME = 'NUMBER'的所有地址 和CUSTOM.VALUE = '5' 但是,在这些地址上,我想显示字段CUSTOM.VALUE,其中CUSTOM.NAME = 'INFO'

以下是一些例子

ADDRESS:

 ID      NAME      STREET
 1       Paul     65 blue street
 2       John     50 red street

CUSTOM:

ID      IDADDRESS     NAME    VALUE
 1           1         NUMBER    5
 2           1         INFO      1st floor
 3           2         NUMBER    6
 4           2         INFO      no info

我想要的结果是: 保罗 - 65蓝街 - 一楼

有人可以帮我解决这个问题吗? 我试过了:

SELECT * FROM ADDRESS, CUSTOM WHERE ADDRESS.ID=CUSTOM.ADDRESSID AND ((CUSTOM.NAME='NUMBER' AND CUSTOM.VALUE='5') OR CUSTOM.NAME='INFO')

3 个答案:

答案 0 :(得分:1)

尝试以下操作,加入CUSTOM两次

SELECT *
FROM ADDRESS, CUSTOM c1, CUSTOM c2
WHERE ADDRESS.ID = c1.ADDRESSID
 AND  c1.ADDRESSID = c2.ADDRESSID and c1.NAME <> c2.NAME

也许我删除了一些仍需要的条件......

答案 1 :(得分:0)

表格&#39; CUSTOM&#39;似乎包含2种不同类型的数据,NUMBER和INFO。这意味着您应该将这两种类型的数据视为不同的表,并单独加入。您的查询会/可能会这样:

SELECT a.NAME 
,   a.STREET 
,   inf.VALUE
FROM ADDRESS a
JOIN CUSTOM num
ON a.ID      = num.IDADDRESS
AND num.NAME = 'NUMBER'
JOIN CUSTOM inf
ON a.ID         = inf.IDADDRESS
AND inf.NAME    = 'INFO'
WHERE num.VALUE = '5'

如果您有选项,请尝试将表CUSTOM放入2个实际表中,每个表只包含一种类型的数据。这将使其他开发人员清楚地了解表中的数据类型以及如何正确使用表。

答案 2 :(得分:0)

我想要以下内容(它看起来并不真正需要&#34;自定义NUMBER&#34;字段的值):

SELECT a.id, a.name, a.street, c.value
  FROM address a LEFT JOIN custom c
    ON a.id = c.addressid
   AND c.name = 'INFO'
 WHERE EXISTS ( SELECT 1 FROM custom c1
                 WHERE c1.addressid = a.id
                   AND c1.name = 'NUMBER'
                   AND c1.value = '5' );

这将获取ADDRESSCUSTOM中相应行的所有行,其中name = 'NUMBER'value = {{1} }。即使没有相应的'5'行(因此'INFO'而不是LEFT JOIN),它也会检索这些行...在这些情况下,INNER JOIN将返回自定义值。