【问题标题】:Ignoring a column when joined column has more than one value连接列具有多个值时忽略列
【发布时间】:2012-06-01 04:38:10
【问题描述】:

我有一个表 Orgs,其中包含以下数据:

ID   Name            AddressID
0    McDonalds          4
1    Starbucks          5
2    Burger King        7

我还有一个地址表,其中包含以下数据:

ID   OrgID   Address
3     0      123 Main St.
4     0      456 East Ave.
5     1      789 Young St.
6     2      5 Riverside Dr.
7     2      8 Lakeview Ave.

我需要创建一个 select 语句,从 Orgs 表中选择公司名称及其地址。 Orgs 表中的公司可以有 1 个或多个地址。如果公司只有一个地址,我不想返回该公司的任何地址。如果公司有多个地址,我想返回Orgs.AddressID = Addresses.ID的地址

所以我的结果应该是这样的:

ID   Name         Address
0    McDonalds    456 East Ave.
1    Starbucks
2    Burger King  8 Lakeview Ave.

我不知道该怎么做。感谢您的帮助!

【问题讨论】:

  • 我的标题应该是“当连接的列只有一个值时忽略一列”。不确定是否可以更新我的标题。

标签: tsql join count


【解决方案1】:
SELECT 
    O.ID, O.Name, A.Address
FROM 
    Orgs O
LEFT OUTER JOIN 
    (SELECT OrgID FROM Addresses GROUP BY OrgID HAVING COUNT(*) > 1) X ON O.ID = X.OrgID
LEFT OUTER JOIN 
    Addresses A ON X.OrgID = A.OrgID AND O.AddressID = A.ID

【讨论】:

  • 我想修复你的代码。您在 O.Name 之后遗漏了一个逗号,但 Stackoverflow 不允许更改少于 6 个字符。你能改变它吗?谢谢一百万!
  • @AndroidDev,我在尝试修复其他良好代码中的 1 个字符拼写错误时遇到了这个确切的问题!
【解决方案2】:

没有数据本身很难,但是像这样?

SELECT 
    orgs.OrgID
,   orgs.Name
,   CASE 
        WHEN OrgCount > 1 THEN ad.Address
        ELSE '' 
    END AS Address
FROM        
(
    SELECT 
        OrgID
    ,   Name
    ,   COUNT(*) AS OrgCount
    FROM 
    Orgs
) orgs
INNER JOIN 
Addresses ad
    ON 
    ad.AddressID = orgs.AddressID 
GROUP BY 
    orgs.OrgID
,   orgs.Name
,   CASE 
        WHEN OrgCount > 1 THEN ad.Address
        ELSE '' 
    END AS Address

【讨论】:

    【解决方案3】:

    SQL fiddle with a working Demo

    SELECT O.ID, O.Name, IsNull(A.addr, '') as Address
    FROM Org O
    LEFT JOIN 
    (
      SELECT OrgID 
      FROM Address 
      GROUP BY OrgID 
      HAVING COUNT(*) > 1
    ) c 
      ON O.ID = c.OrgID
    LEFT JOIN Address A 
      ON c.OrgID = A.OrgID 
      AND O.AddressID = A.ID
    

    【讨论】:

    • 与 DJ 完全相同的解决方案。希望我能给你们两个打勾。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多