【问题标题】:Sybase =* joing to mysql right outer joinSybase =* 加入 mysql 右外连接
【发布时间】:2014-01-09 15:19:19
【问题描述】:

我有以下 Sybase sql 语句,其中包含使用语法 =* 的右外连接(我认为)。我试图在 mysql 中复制它并且失败了。任何人都可以建议我如何在 from 部分中声明正确的外部连接。

SELECT database1.inst.regionAbb,
       database1.inst.regionalCode,
       database1.inst.instCode,
       database1.inst.name,
       database1.inst.yCode,
       database1.blac.customerCode,
       database1.inst.transportCode,
       database1.inst.Agreement,
       database1.addr.telephone,
       database1.addr.fax,
       database1.addr.email,
       database1.addr.id contactaddr,
       database1.inst.nameAbb,
       database1.inst.messageType,
       database1.inst.closedFrom,
       database1.inst.closedTo,
       database1.inst.costScheme1,
       database1.inst.costScheme2,
       database1.inst.costScheme3,
       database1.inst.costScheme4,
       database1.inst.costScheme5,
       now() updated

FROM database1.Table1 inst,
     database1.Table2 addr,
     database1.Table3 blac

WHERE ((database1.addr.instCode = database1.inst.instCode) **
       AND ((database1.blac.instCode =* database1.inst.instCode)**
       AND (database1.blac.preferred = "Y")))
       AND ((database1.addr.id = database1.inst.Address
       AND database1.inst.lendingTable2 != 0)
       OR (database1.addr.id = database1.inst.mainTable2
       AND database1.inst.lendingTable2 = 0))

【问题讨论】:

  • “原始 Sybase 查询”是怎么回事。在中间?
  • 抱歉,OGHaza 帖子混乱了。我已经更正了 SQL。你能帮忙吗?
  • 恐怕我对 sybase 不熟悉,但你是想从 sysbase -> mysql 还是 mysql -> sysbase 去,因为我可能会建议你是否尝试转到mysql
  • 试图从 sybase 转到 mysql。它是 where 子句“=*”中的一部分,它代表(我相信)一个右外连接,但在 mysql 中,您在 from 部分中指定连接。

标签: mysql sybase outer-join


【解决方案1】:

我不熟悉 Sybase,但我认为这就是你想要的:

SELECT * FROM 
FROM database1.Table1 inst,
INNER JOIN database1.Table2 addr ON addr.instCode = inst.instCode
LEFT JOIN database1.Table3 blac ON blac.instCode = inst.instCode
WHERE blac.preferred = "Y"
  OR (blac.preferred IS NULL AND
       ((addr.id = inst.Address    AND inst.lendingTable2 != 0)
     OR (addr.id = inst.mainTable2 AND inst.lendingTable2 = 0)))

这假设它只做最后检查是否没有 blac 记录 - 如果你真的想要检查是否没有 blac 记录或 blac.preferred != 'Y' 那么你也可以删除 blac.preferred IS NULL AND作为额外的一对括号。

【讨论】:

  • 不太对。我认为它给我的结果太少了,因为右边的外部不在里面。如果我将“INNER JOIN database1.Table3 blac ON blac.instCode = inst.instCode”行更改为右外连接,它也不起作用。哼哼。虽然肯定会取得进展
  • 对不起,我今天回来回答这个问题时没有重新阅读问题文本 - 但是从查看 where 子句,我觉得 INNER JOINS 是你需要的。您指定 blac.preferred = "Y"addr.id = inst.Address OR inst.mainTable2。因此,为了满足这些 WHERE 要求,所有 3 个表都需要在结果集中出现相应的记录 - 我怀疑 WHERE 子句与 Sybase 中的子句相比不正确(或者 Sybase 对 JOINS 的处理方式不同)
  • 即使boacaddr 记录不存在,您是否总是希望返回inst 记录?
  • 我相信即使 blac 记录不存在,它也会带回一个记录。它需要有一个 inst 记录和一个 addr 记录,但不是专门的 blac 记录。如果没有 blac 帐户,则包含 OR 的下一部分将迎合。
  • 好的,我已经更新了我的答案,如果你想要的话,请告诉我
【解决方案2】:

选择 * 从 (((database1.Table1 inst left join database1.Table3 blac on inst.instCode=blac.instCode and blac.preferred="Y") 加入 database1.Table2 addr on (addr.instCode=inst.instCode and ((addr.id = inst.lendingTable2 and inst.lendingTable20) 或 ((addr.id=inst.mainTable2 ) 和 (inst.lendingTable2=0)))));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2012-02-26
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2015-01-11
    相关资源
    最近更新 更多