【问题标题】:case when on inner join内部连接时的情况
【发布时间】:2014-12-04 06:46:18
【问题描述】:

我有以下 4 个表:MainTable、Warehouse、Customer 和 Company。

这些表的架构:

create table MainTable(ID int, Warehouse_id int, Customer_ID int)
create table Warehouse (Warehouse_id int, company_id int)
create table Customer (Customer_ID int, Company_ID int)
create table company (Company_id int, Country_ID int, Zone_ID int)

objectif 是获取(MainTable 的)对应 ID 的 Country_ID 和 Zone_ID。

我们有 2 种不同的情况:if MainTable.Warehouse_ID 不为空,我们应该对 Warehouse 表(在字段warehouse_id)进行内部连接,然后在公司表(在字段 Company_ID)上进行连接, else(如果 MainTable.Warehouse_ID 为空)我们应该在 Customer 表(在 Customer_ID 字段上)和 Company 表(在 Company_ID 字段上)进行内部连接。

以下查询在单词“case”附近生成错误:

select CO.Country_ID, CO.Zone_ID
from    MainTable MT 
inner join (case 
    when MT.Warehouse_ID is not null 
then
         Warehouse W on MT.Warehouse_ID=W.Warehouse_ID 
        inner join Company CO on W.Company_ID=CO.Company_ID
else     
         Customer Cu on MT.Customer_ID=Cu.Customer_ID
        inner join Company C on Cu.Company_ID=CO.Company_ID
    end)

我是否正确地处理了一个我错过的小语法错误?如果没有..还有其他方法吗?

谢谢

【问题讨论】:

  • 一种方法是动态查询!但你需要为它使用一个存储过程
  • 动态 SQL 无济于事,因为条件特定于每一行

标签: sql-server case inner-join


【解决方案1】:

你可以使用UNION:

SELECT CO.Country_ID, CO.Zone_ID
  FROM MainTable MT
  INNER JOIN Warehouse W ON MT.Warehouse_ID=W.Warehouse_ID
  INNER JOIN Company CO on W.Company_ID=CO.Company_ID
  WHERE MT.Warehouse_ID IS NOT NULL
UNION
SELECT CO.Country_ID, CO.Zone_ID
  FROM MainTable MT
  INNER JOIN Customer Cu ON MT.Customer_ID=Cu.Customer_ID
  INNER JOIN Company CO on Cu.Company_ID=CO.Company_ID
  WHERE MT.Warehouse_ID IS NULL

【讨论】:

    【解决方案2】:

    试试下面的方法:

    IF EXISTS(SELECT 1
              FROM   MainTable mt
              WHERE  mt.Warehouse_ID IS NOT NULL)
      BEGIN
          SELECT CO.Country_ID,
                 CO.Zone_ID
          FROM   MainTable MT
                 INNER JOIN Warehouse W
                         ON MT.Warehouse_ID = W.Warehouse_ID
                 INNER JOIN Company CO
                         ON W.Company_ID = CO.Company_ID
      END
    ELSE
      BEGIN
          SELECT CO.Country_ID,
                 CO.Zone_ID
          FROM   MainTable MT
                 INNER JOIN Customer Cu
                         ON MT.Customer_ID = Cu.Customer_ID
                 INNER JOIN Company C
                         ON Cu.Company_ID = CO.Company_ID
      END 
    

    【讨论】:

      【解决方案3】:

      你不能那样做。 你希望输出是什么这种条件连接?

      您是否尝试过使用外连接?

      select ISNULL(C1.Country_ID,C2.Country_ID) as Country_ID,ISNULL(C1.Zone_ID,C2.Zone_ID) as Zone_ID
      from    MainTable MT 
      left outer join  Warehouse W on MT.Warehouse_ID=W.Warehouse_ID 
      left outer join Company1 C1 on W.Company_ID=C1.Company_ID
      left outer join Customer Cu on MT.Customer_ID=Cu.Customer_ID
      left outer join Company2 C2 on Cu.Company_ID=C2.Company_ID
      

      【讨论】:

      • 请问减号是什么?
      • 感谢大家的帮助。托马斯,左外连接它可以工作:)
      猜你喜欢
      • 2022-01-23
      • 2020-05-18
      • 2011-12-27
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      相关资源
      最近更新 更多