【问题标题】:How do I combine three "select distinct" from same table如何从同一张表中组合三个“选择不同”
【发布时间】:2011-10-16 07:11:04
【问题描述】:

对于一个搜索功能,我想返回三种类型的结果,所以我查询了3次。将查询 JOIN 或 UNION 合并为一个可能会更好,但是如何..

string sql1 = "SELECT DISTINCT area, CHARINDEX(@ss, area) FROM rgmaplocation WHERE area LIKE '%' + @ss + '%' ORDER BY CHARINDEX(@ss, area) ";
string sql2 = "SELECT DISTINCT compound, CHARINDEX(@ss, compound) FROM rgmaplocation WHERE compound LIKE '%' + @ss + '%' ORDER BY CHARINDEX(@ss, compound) ";
string sql3 = "SELECT DISTINCT streetname, CHARINDEX(@ss, streetname) FROM rgmaplocation WHERE streetname LIKE '%' + @ss + '%' ORDER BY CHARINDEX(@ss, streetname)";

【问题讨论】:

    标签: sql database sql-server-2005


    【解决方案1】:

    类似这样的东西来合并结果并按 charindex 表达式进行排序。

    ;WITH C(Loc, Idx) AS
    (
      SELECT DISTINCT area, CHARINDEX('g', area) 
      FROM rgmaplocation 
      WHERE area LIKE '%g%' 
      UNION ALL
      SELECT DISTINCT compound, CHARINDEX('g', compound) 
      FROM rgmaplocation 
      WHERE compound LIKE '%g%' 
      UNION ALL
      SELECT DISTINCT streetname, CHARINDEX('g', streetname) 
      FROM rgmaplocation 
      WHERE streetname LIKE '%g%' 
    )
    SELECT Loc, Idx
    FROM C
    ORDER BY Idx
    

    【讨论】:

    • UNION ALL,因为这三个结果集可能无论如何都不同。
    【解决方案2】:

    Mikael Eriksson's solution 如果您不介意将区域、小区和街道名称混在一起,那就太好了。如果你想把它们分开,你去吧

    WITH C(No,Loc, Idx) AS
    (
      SELECT DISTINCT 1,area, CHARINDEX('g', area) 
      FROM rgmaplocation 
      WHERE area LIKE '%g%' 
      UNION 
      SELECT DISTINCT 2,compound, CHARINDEX('g', compound) 
      FROM rgmaplocation 
      WHERE compound LIKE '%g%' 
      UNION 
      SELECT DISTINCT 3,streetname, CHARINDEX('g', streetname) 
      FROM rgmaplocation 
      WHERE streetname LIKE '%g%' 
    )
    SELECT No,Loc, Idx
    FROM C
    ORDER BY No,Idx
    

    【讨论】:

      【解决方案3】:

      使用UNION,就像你说的那样:

      string sqlAll = string.Format( "{0} UNION {1} UNION {2}", sql1, sql2, sql3 );
      

      【讨论】:

      • SELECT DISTINCT area, CHARINDEX('g', area) FROM rgmaplocation WHERE area LIKE '%g%' ORDER BY CHARINDEX('g', area) UNION SELECT DISTINCT Compound, CHARINDEX('g' , 复合) FROM rgmaplocation WHERE complex LIKE '%g%' ORDER BY CHARINDEX('g', complex) UNION SELECT DISTINCT streetname, CHARINDEX('g', streetname) FROM rgmaplocation WHERE streetname LIKE '%g%' ORDER BY CHARINDEX( 'g', streetname) 它显示 Msg 156, Level 15, State 1, Line 1 关键字'UNION'附近的语法错误。消息 156,级别 15,状态 1,第 1 行关键字“UNION”附近的语法不正确
      • @Jesper 我刚刚在 SSMS 中使用您最初的 3 个 SQL 语句测试了我的建议。我没有收到任何错误(当然,我没有声明变量@ss)。
      • 这里一直报错。我已经完全按照此处所写的方式添加了您的行。
      • @Jesper - order by 在联合查询中仅对整个表达式有效。每个零件不能有一个订单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多