对此抱歉,但SQL对我来说不是一个强项,虽然看起来类似于许多其他查询,但我无法成功地将这些转换为这种情况.
如果表2中的行存在,我有两个表将通过公共值(id和Issue)相关联.
我需要获得一系列用户提出特定问题.我在两个表中都有用户,如果表2用户存在则优先使用.
表1中始终存在REPORTER,但表2中可能没有Namevalue of name(fieldtype = 1).如果存在Stringvalue,则表示“User”,并且可以忽略Reporter.
表格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).
我的不同用户总数= 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中有名称值,也会在结果中返回.
我已经尝试过存在但无法获得正确的语法或正确的结果.只要尝试链接ID和Issue值的任何Join,结果总是最终约束到匹配的行或所有值.并且向ON添加附加条件不会返回正确的结果.
我已经尝试了太多的排列列表,逻辑上这听起来应该能够与存在的地方结合,或者留下外部联接,但我的技能缺乏使这项工作.
最佳答案 您需要使用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 |
+------+---------+