Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL动态连接不同列上的表_Sql_Join_Dynamic_Logic_Case - Fatal编程技术网

SQL动态连接不同列上的表

SQL动态连接不同列上的表,sql,join,dynamic,logic,case,Sql,Join,Dynamic,Logic,Case,第一次发布 有一个用例,我们希望将一些销售数据连接到主协议表,以确定事务级别的适用费用 困难的部分是,协议表有各种可能性,在更糟糕的情况下,至少是一个“包罗万象” 我们希望从“最细粒度”级别开始。因此紫色线匹配所有可能的值。 但是,像blue sales record这样的字段与主字段(供应商除外)的任何值都不匹配,因此在这种情况下,它是一个包罗万象的字段 我曾想过将主数据中的所有行合并,但随后我需要找到一种将其与sales合并的方法?简单的合并不会成功地将blue row示例合并在一起。因此

第一次发布

有一个用例,我们希望将一些销售数据连接到主协议表,以确定事务级别的适用费用

困难的部分是,协议表有各种可能性,在更糟糕的情况下,至少是一个“包罗万象”

我们希望从“最细粒度”级别开始。因此紫色线匹配所有可能的值。 但是,像blue sales record这样的字段与主字段(供应商除外)的任何值都不匹配,因此在这种情况下,它是一个包罗万象的字段

我曾想过将主数据中的所有行合并,但随后我需要找到一种将其与sales合并的方法?简单的合并不会成功地将blue row示例合并在一起。因此,合并必须动态选择要比较的列

碰巧,有没有用户对如何实现这一点有什么想法? 谢谢

(表格代码)

创建表T_测试_协议( 供应商VARCHAR(254), 项目VARCHAR(254), 程序INT, RXDA VARCHAR(254), CTRCT INT, 费因特 ))

创建表T\u测试\u协议\u销售( 供应商VARCHAR(254), 项目VARCHAR(254), 程序INT, RXDA VARCHAR(254), CTRCT INT ))

在T_测试_协议值中插入 (123,'A',60,'Y',4,1), (123,'A',61,'N',4,2), (123,'B',62,无效,5,3), (123,'C',空,'Y',6,4), (123,空,63,空,空,5), (123,空,空,'Y',空,6), (123,空,空,空,空,7)

在测试协议中插入销售值 (123,'D',63,无效,无效), (123,'F',空,空,空), (123,'A',61,'N',4),
(123,'C',null,'Y',6);

您可以使用相关子查询:

select st.*,
       (select m.fee
        from master m
        where m.supplier = st.supplier and
              (m.item is null or m.item = st.item) and
              (m.program is null or m.program = st.program) and
              (m.rxda is null or m.rxda = st.rxda) and
              (m.ctrct is null or m.ctrct = st.ctrct)
        order by ( (case when m.item = st.item then 1 else 0 end) +
                   (case when m.program = st.program then 1 else 0 end) +
                   (case when m.rxda = st.rxda then 1 else 0 end) +
                   (case when m.ctrct = st.ctrct then 1 else 0 end) +
                 ) desc
        fetch first 1 row only
       ) as fee               
from sales_transactions st;

这使用标准SQL语法。它可能因行而异。

您可以使用相关子查询:

select st.*,
       (select m.fee
        from master m
        where m.supplier = st.supplier and
              (m.item is null or m.item = st.item) and
              (m.program is null or m.program = st.program) and
              (m.rxda is null or m.rxda = st.rxda) and
              (m.ctrct is null or m.ctrct = st.ctrct)
        order by ( (case when m.item = st.item then 1 else 0 end) +
                   (case when m.program = st.program then 1 else 0 end) +
                   (case when m.rxda = st.rxda then 1 else 0 end) +
                   (case when m.ctrct = st.ctrct then 1 else 0 end) +
                 ) desc
        fetch first 1 row only
       ) as fee               
from sales_transactions st;

这使用标准SQL语法。它可能会因行而异。

请解释要实现的逻辑。并提供所需的结果。请解释要实现的逻辑。并提供所需的结果。这太接近了,太酷了!我当然没有想过要这样做。但在尝试此代码时“蓝色“原始示例中的行确实出现错误。申请的费用应该是master提供的.7数字,因为这是一个包罗万象的数字,因为没有其他值匹配。但是代码的输出给了你一笔费用。2,不知怎么地,它与大师的第二行相匹配?@JonathanHodge。是的,我明白了。它只需要过滤实际匹配,然后计算匹配列。我一直在玩代码的调整,现在已经很好地掌握了它的工作原理。你能举例说明如何完成你提到的事情吗?这仅仅是一个case语句来确认订单,否则在只有splr存在的情况下对主控进行子查询以获得费用吗?@JonathanHodge。我已经修好了密码。但后来又把它打破了。然后就修好了,太近了,太酷了!我当然没有想过要做这样的事情。但在尝试此代码时,原始示例中的“蓝色”行确实出现错误。申请的费用应该是master提供的.7数字,因为这是一个包罗万象的数字,因为没有其他值匹配。但是代码的输出给了你一笔费用。2,不知怎么地,它与大师的第二行相匹配?@JonathanHodge。是的,我明白了。它只需要过滤实际匹配,然后计算匹配列。我一直在玩代码的调整,现在已经很好地掌握了它的工作原理。你能举例说明如何完成你提到的事情吗?这仅仅是一个case语句来确认订单,否则在只有splr存在的情况下对主控进行子查询以获得费用吗?@JonathanHodge。我已经修好了密码。但后来又把它打破了。然后就修好了。