有相当多类似的问题,但我似乎找不到我要找的东西。我正在构建一个数据集通过SQL查询在蟾蜍。最终,我将从4个不同的表拉到"匹配";把所有的数据放在一起。我知道"匹配"。不是SQL术语,但我的SQL知识和我想做的是有限的。我想要连接匹配的键(LDKEY=TICKETUID,这是有效的),然后从person表中匹配/连接PERSONID到OWNER(随后,获取人员的FIRST和LAST names),并最终重复这里没有的人员部门,因为我认为它将非常类似于names。
所以我有:
(SELECT ld.CONTENTUID, ld.LDKEY, p.TICKETUID, p.OWNER, p.OWNERGROUP, p.PLUSDETECTION,
ld.LDOWNERTABLE, LOWER(ld.LDTEXT), ld.LDOWNERCOL, p.DESCRIPTION, pe.PERSONID, pe.FIRSTNAME, pe.LASTNAME
FROM
MAXIMO.LONGDESCRIPTION ld
INNER JOIN MAXIMO.PLUSCA p ON LDKEY = TICKETUID,
MAXIMO.PERSON pe
INNER JOIN MAXIMO.PLUSCA ON (pe.PERSONID = MAXIMO.PLUSCA.OWNER)
WHERE (p.REPORTDATE > TO_DATE('06/01/2018 0:00:00', 'MM/DD/YYYY HH24:MI:SS')) AND
(LDKEY != '804928982' AND LDKEY != '804928844') AND
AND (p.LEVEL = 'A' OR p.LEVEL = 'B' OR p.LEVEL = 'C')
FROM语句的第一部分单独工作:
FROM MAXIMO.LONGDESCRIPTION ld INNER JOIN MAXIMO.PLUSCA p ON LDKEY = TICKETUID
然而,当我要在PERSON表中添加时,事情发生了变化。我已经尝试了一些东西,比如:
MAXIMO.PERSON pe
INNER JOIN MAXIMO.PLUSCA p ON (pe.PERSONID = p.OWNER)
Yields ambiguous column error on LEVELs further down.
MAXIMO.PERSON pe
INNER JOIN MAXIMO.PLUSCA p2 ON (pe.PERSONID = p2.OWNER)
Runs, but creates a MUCH larger dataset than expected and OWNER and PERSON do not seem to match
MAXIMO.PERSON pe
INNER JOIN p ON (pe.PERSONID = p.OWNER)
Yields undefined
我在这里做错了什么?我怎样才能从"拉"出来呢?多个表吗?
谢谢
你已经知道,你所做的是错误的。
- 您应该逐表编写
FROM
子句,在您执行的每一步后进行测试 - 越简单越好;如果您连接为
maximo
,从查询中删除它,它没有帮助 - 使用表别名
inner join
和join
一样好(至少在Oracle;您使用哪个数据库?TOAD代表"Oracle应用程序开发人员工具"。
您目前拥有的是(简化)
FROM longdescription ld
JOIN plusca p ON ldkey = ticketuid ,person pe
JOIN plusca ON pe.personid = plusca.owner
第二行显然是错误的。,person pe
在这里做什么?不知道ldkey
和ticketuid
属于哪个表(没有表别名,对吧?)。
第三行包含表plusca
,就像第二行一样。这是"允许的",它被称为self join,但我不确定这是您真正想要的。
select *
from longdescription ld join plusca p on ld.key = p.ticketuid
如果正确,再添加一个表:PERSON
:
select *
from longdescription ld join plusca p on ld.key = p.ticketuid
join person pe on pe.some_column = p.some_column (or maybe ld.some_column) --> ???
我不能为你写第三行,我不知道应该使用哪些列将person
表连接到longdescription
和/或plusca
,但你应该知道。写完之后,运行查询,看看它是否返回正确的结果。然后继续,如果需要,添加其他表。
最后,where
子句:在一切都正确连接之后,使用它来进一步限制结果数据集。像这样:
where p.reportdate > date '2018-06-01' --> date literal; time component is set to 00:00:00 anyway
and ld.ldkey not in ('804928982', '804928844') --> use IN; table alias?
and p.level in ('A', 'B', 'C') --> use IN