【问题标题】:SQL - Different joins regarding to column valueSQL - 关于列值的不同连接
【发布时间】:2015-04-01 01:52:03
【问题描述】:

我有架构,其中为灵活的实现创建了表。假设我有 3 张桌子:

1. Customer

- CUSTOMER_ID
- NAME

2. Account

- ACCOUNT_ID
- ACCOUNT_TYPE
- IBAN

3. Dummy_table

- Dummy_table_id
- FK_CUSTOMER_ID
- FK_ACCOUNT_ID
- TABLE_NAME

我想在 JOIN 子句中实现模式逻辑。实现这一点的最佳方法是什么:

if (TABLE_NAME == "CUSTOMER") then {
  JOIN WITH CUSTOMER TABLE USING FK_CUSTOMER_ID
} else {
  JOIN WITH ACCOUNT TABLE USING FK_ACCOUNT_ID
}

【问题讨论】:

  • 正确解释您的需求和业务规则。
  • 拉利特,请检查伪代码。
  • 这是不清楚的。这段代码到底要在哪里实现?你到底想做什么?为什么要动态引用数据库表?表名从哪里传递给您的 IF 构造?如果没有传递表名,或者传递了一些垃圾值,会发生什么?请正确解释您的要求。
  • 写的是-我想要一个SQL查询,我想在JOIN子句中实现IF构造......所以这意味着表名是从Dummy_table列传递的......
  • 如果我明白你在问什么,你就不能。 SQL 不能那样工作。您可以潜在地使用动态 SQL 来构造两个不同的查询之一,或者您可以静态地构造两个不同的查询并将 UNION ALL 一起构造。但是,您对“灵活实现”的评论并希望动态确定要加入哪个表,这对我来说意味着您没有正确构建数据模型。如果是这种情况,我强烈建议在使您的代码非常复杂之前重新考虑模型。

标签: sql oracle join oracle11g


【解决方案1】:

您可以使用外部连接以某种方式做到这一点:

select dt.dummy_table_id,
       dt.table_name,
       c.customer_id, 
       c.name, 
       a.account_id,
       a.account_type,
       a.iban
from dummy_table dt
  left join customer c 
         on c.customer_id = dt.fk_customer_id 
        and dt.table_name = 'CUSTOMER'
  left join account a 
         on a.account_id = dt.fk_account_id 
        and dt.table_name = 'ACCOUNT'

这将为您提供那些不匹配的列的NULL 值。但是,对于那些包含customer_id account_id 的“虚拟行”,它将为您提供来自dummy_table两个 结果行。

但是你没有指定你想要什么输出,所以我不知道这对你来说是否有问题。

但我同意贾斯汀的评论:这听起来不是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多