如何从两个相关但不同的表中获得不同的用户数

时间:2015-10-22 12:54:05

标签: sql oracle union

为此道歉但SQL对我来说不是一个强项,虽然看起来与许多其他查询相似但我无法成功地将这些转换为这种情况。

如果表2中的行存在,我有两个表将通过公共值(id和Issue)相关联。

我需要明确计算用户提出的特定问题。我在两个表中都有用户,如果存在,则表2用户优先。

表1中始终有一个REPORTER,但表2中可能没有Namevalue of name(fieldtype = 1)。如果有一个Stringvalue,则表示“User”,并且可以忽略Reporter。 / p>

表1

| id | Reporter| Type |
| 1  | 111111  | 1    |
| 2  | 111111  | 2    |
| 3  | 222222  | 2    |
| 4  | 333333  | 1    |
| 5  | 111111  | 1    |
| 6  | 666666  | 1    |

表2

|issue | Stringvalue | fieldType|
| 1    |  Fred       |    1     |
| 1    | bananas     |    2     |
| 2    |  Jack       |    1     |
| 5    |  Steve      |    1     |

我总共有4个正确类型的问题(1,4,5,6),3个记者(111111,333333,666666)和两个Stringvalues(Fred,Steve)。 我的Distinct Users总数= 4(Fred,333333,Steve,666666)

结果表

| id| T1.Reporter | T2.Name |
|  1|  Null       | Fred    |
|  4| 333333      | Null    |
|  5|  Null       | Steve   |
|  6| 666666      | Null    |

如何在SQL中获得此结果!

目前为止最近的尝试:

 SELECT 
  table1.REPORTER,
  TO_CHAR(NULL) "NAME"
  FROM table1
  Where table1.TYPE =1
  AND table1.REPORTER <> '111111'
 Union 
SELECT 
  TO_CHAR(NULL) "REPORTER",
  table2.STRINGVALUE "NAME"
FROM table2,
  table1 
WHERE table2.ISSUE     = table1.ID
AND table2.fieldtype= 1
and table1.issuetype = 1

如果没有明确排除默认表1 Reporter,即使表2中有名称值,也会在结果中返回。

我已经尝试了exists但是无法获得正确的语法或正确的结果。只要尝试链接ID和Issue值的任何Join,结果总是最终约束到匹配的行或所有值。并且向ON添加附加条件不会返回正确的结果。

我已经尝试了太多的排列列表,从逻辑上讲这听起来应该能够与存在的地方结合,或者留下外部联接,但我的技能缺乏使这项工作。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您需要left joincount(distinct)。以下是我认为您正在寻找的内容:

select count(distinct coalesce(stringval, reporter) )
from table1 t1 left join
     table2 t2
     on t1.id = t2.issue and t2.fieldtype = 1
where t1.id in (1, 4, 5, 6);

您需要学习如何使用显式JOIN语法。作为一个简单的规则:从不FROM子句中使用逗号。始终使用显式JOIN语法。首先,它更强大,可以很容易地表达外连接。

答案 1 :(得分:1)

您需要使用LEFT JOIN,这是您指定fieldtype = 1子句的地方:

SELECT 
    table1.id,
    CASE
        WHEN table2.Stringvalue IS NOT NULL THEN table2.Stringvalue
        ELSE table1.Reporter
    END AS TheUser
FROM table1
LEFT JOIN table2 ON table1.id = table2.issue AND table2.fieldType = 1
WHERE table1.Type = 1

结果:

+------+---------+
| id   | TheUser |
+------+---------+
|    1 | Fred    |
|    4 | 333333  |
|    5 | Steve   |
|    6 | 666666  |
+------+---------+