【问题标题】:How to retrieve same column twice with different conditions in same table?如何在同一个表中以不同的条件检索同一列两次?
【发布时间】:2013-05-07 16:18:12
【问题描述】:

这是我的桌子:

Anganbadi_ID               Food     Month
-------------------------------------------    
1165                       हाँ         1
1165                       हाँ         2
1165                       हाँ         4
1168                       हाँ         4
2032                       नहीं        4
2218                       नहीं        4
2219                       हाँ         4
2358                       नहीं        4
2546                        हाँ        10 

Anganbadi_ID, Food, Month, Year 有 4 列,我想根据两个不同的月份值比较 Food 列两次。

例如如果我为第一个 Food (Food-1) 列选择 Month=4,为第二个 Food (Food-2) 列选择 Month=10,那么它应该如下所示::

Anganbadi_ID            Food-1     Food-2    
------------------------------------------    
1165                       हाँ          NULL 
1168                       हाँ          NULL 
2032                       नहीं        NULL 
2218                       नहीं        NULL 
2219                       हाँ          NULL 
2358                       नहीं        NULL 
2546                     NULL        हाँ 

当我尝试这段代码时

SELECT     
   Anganbadi_ID, Food,
   (SELECT Food
    FROM Anganbadi AS Anganbadi_2
    WHERE (Anganbadi_1.Anganbadi_ID = Anganbadi_ID) 
      AND (Anganbadi_1.Month = 10)
   ) AS 'Food(2)'
FROM Anganbadi AS Anganbadi_1
WHERE (Month = 4)

它显示以下结果::

Anganbadi_ID              Food-1     Food-2    
--------------------------------------------
1165                       हाँ          NULL 
1168                       हाँ          NULL 
2032                       नहीं        NULL 
2218                       नहीं        NULL 
2219                       हाँ          NULL 
2358                       नहीं        NULL 

请尽快帮助我......

【问题讨论】:

  • 嘿伙计们,不知道你为什么这么快就把这个问题记下来,我认为有 3 个错误的答案恕我直言,但他们显然将英语作为第二(或更低)语言并且正在开始出去。是的,它之前被问过。

标签: sql sql-server database


【解决方案1】:
SELECT DISTINCT Anganbadi_ID,

(SELECT Food 
 FROM Anganbadi 
 WHERE      (Anganbadi_ID = A.Anganbadi_ID) 
    AND (Month = 4)) AS Food1,

(SELECT Food 
 FROM Anganbadi 
 WHERE      (Anganbadi_ID = A.Anganbadi_ID) 
    AND (Month = 10)) AS Food2

FROM Anganbadi AS A 
WHERE A.Month = 10 OR A.Month = 4

SQL Fiddle

【讨论】:

  • 它显示错误'子查询返回超过 1 行',为什么?
【解决方案2】:
SELECT Anganbadi_ID, Food as food1, null as Food2
where Month = 4

UNION ALL

SELECT Anganbadi_ID, null as food1, food as Food2
where Month = 10

【讨论】:

  • 为什么投反对票?这完全符合这个家伙的要求!
【解决方案3】:

这里的关键是ID上的全外连接,每个子查询中的条件可以是任何东西,全外连接会给你一个ID匹配的行,而相反的列则为空。如果您想要所有结果,即使食物在任一月份都不满足任何条件,请在其中一个子查询中使用 AllFoodsTable 中的选择 ID 进行左连接

SELECT Food1, Food2, ID
FROM (
  SELECT Food1, ID
  FROM MyTable
  WHERE Month = 4
) Con1
FULL OUTER JOIN (
  SELECT Food2, ID
  FROM MyTable
  WHERE Month = 10
) Con2
ON Con1.ID = Con2.ID

【讨论】:

    【解决方案4】:
    SELECT DISTINCT Anganbadi_ID
    ,(SELECT     Food
    FROM          Anganbadi AS Anganbadi_2
    WHERE      (Anganbadi_1.Anganbadi_ID = Anganbadi_ID) AND (Month = 4)) AS 'Food(4)'
    ,(SELECT     Food
    FROM          Anganbadi AS Anganbadi_2
    WHERE      (Anganbadi_1.Anganbadi_ID = Anganbadi_ID) AND (Month = 10)) AS 'Food(10)'
    
    FROM         Anganbadi AS Anganbadi_1
    

    SQL-Fiddle

    【讨论】:

      【解决方案5】:
      SELECT 
      Food
      DISTINCT Anganbadi_ID,
      
      (SELECT Food 
       FROM Anganbadi 
       WHERE      (Anganbadi_ID = A.Anganbadi_ID) 
          AND (Month = 4)) AS Food1,
      
      FROM Anganbadi AS A 
      WHERE A.Month = 10 OR A.Month = 4
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2015-04-03
      相关资源
      最近更新 更多