SQL帮助 - 不确定是否需要分区或某种CASE语句

时间:2015-04-15 22:16:41

标签: oracle join

Table1以一对多的关系加入Table2Table2可以在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语句似乎是浪费。似乎应该有更快/更有效的方式。如果有人有任何想法,我可以向他们开放。

0 个答案:

没有答案