Table1
以一对多的关系加入Table2
。 Table2
可以在code
列中显示一行,其值为A
,或者一行包含code
列,其值为B
,或者两者都有。它还可以有一堆其他行以不同的值连接,但我只关注具有A或B code
字段的行。
我想查询Table1
并在Table2
中离开加入,我只想要返回一行,而不是Table2
中每行的记录。但是,除非只有Table2
行,否则我只希望code = A
中的code = B
行。
有了这样说,我就像这样格式化我的SQL,如果table2有两行符合where子句,则下面的结果将产生两行。我只想要一行,我希望该行成为code = A
的行,除非code = A
没有行,在这种情况下我想要code = B
的那一行。
SELECT *
FROM (
SELECT a,b,c,d
FROM table
WHERE id = 1
) popsel
LEFT JOIN (
SELECT fkid,stuff
FROM otherTable
) data ON data.fkid = popsel.id
LEFT JOIN (
SELECT fkid,otherstuff
FROM table2
WHERE code = 'A' OR code = 'B'
) codes ON codes.fkid = popsel.id
我知道我可以在第二个连接上添加一个额外的where子句并执行AND id = 1
然后对code
字段进行排名并将返回限制为1行,但我觉得这是低效的肯定有更好的办法。这是一个ORACLE DB。我以为我可以在ON
条款中添加CASE或其他内容,但我无法使其工作。
我甚至不需要有人来编写解决方案,我可以在ORACLE中使用哪些功能来完成此操作,我可以尝试自己完成。我总是很难知道从哪里开始。
编辑:这是我所做的和它的工作,只是不确定它是最好的方式还是最有效的。
LEFT JOIN (
SELECT
stuff,
RANK() OVER (PARTITION BY fk1,fk2 ORDER BY code DESC) codeRank
FROM table2
WHERE code = 'A' OR code = 'B'
) codes ON codes.fk1 = table1.fk1
AND codes.fk2 = table1.fk2
AND (codeRank = 1 OR (
NOT EXISTS (SELECT code FROM table2 WHERE code = 'A' AND codes.fk1 = table1.fk1 AND codes.fk2 = table2.fk2)
)
)
我的意思是它有效,但是用where子句做另一个select语句似乎是浪费。似乎应该有更快/更有效的方式。如果有人有任何想法,我可以向他们开放。