【问题标题】:TSQL Union in sub query子查询中的 SQL 联合
【发布时间】:2017-05-10 19:22:34
【问题描述】:

我有一个名为Employee.emp.Language 的表,其中包含一个可以在 UI 上选择的语言列表。我无法向此表添加记录,也无法直接编辑 UI 来解决我的问题。

我需要在我的查询中添加一个选项,将NULL 添加到我的结果集中。这实际上将允许用户从下拉列表中选择null。

DECLARE @nulls AS TABLE (fieldLabel VARCHAR(10) NULL, fieldValue VARCHAR(10) 

NULL)
INSERT INTO @nulls( fieldLabel, fieldValue )
VALUES  ('NULL', NULL )

SELECT 
(
        SELECT  LanguageName AS FieldLabel,
                LanguageID AS FieldValue
        FROM    Employee.emp.Language
        WHERE  IsRetired = 0
        UNION
        SELECT fieldLabel ,
                fieldValue
            FROM @nulls
    FOR    XML PATH ('options'), ELEMENTS, TYPE, ROOT ('languages') 
)

虽然我的列表包含要在我的下拉列表中选择的 null 选项,但我无法将这段代码保存到我的存储过程中。

我得到的错误是:The FOR XML clause is invalid in views, inline functions, derived tables, and subqueries when they contain a set operator. To work around, wrap the SELECT containing a set operator using derived table syntax and apply FOR XML on top of it.

只要我删除 union 和它后面的 select,一切正常。

如果不直接将值添加到表中,我还能如何完成向结果集添加值?

【问题讨论】:

  • 为什么必须为 'NULL'。 NULL = 未知。您可以在 Employee.emp.Language 表中插入一条记录,其中 LanguageName = 'Unknown'。
  • @Wendy - 我无法通过添加此记录来修改源表。我正在为一个小变通方法设计一个解决方案,在该解决方案中,其他 99% 的时间,NULL 不会是一个可选的选项,也不会出现在列表中。

标签: sql sql-server sql-server-2008 tsql stored-procedures


【解决方案1】:

将其用作子查询,并且您不需要表值,您可以使用带有空值的选择。

create table lang(fieldlabel varchar(10), fieldvalue varchar(20));
insert into lang values 
('en', 'english'),
('fr', 'french');

select fieldlabel, fieldvalue
from (select fieldlabel, fieldvalue
      from   lang
      union all
      select null as fieldlabel, null as fieldvalue) l
FOR    XML PATH ('options'), ELEMENTS, TYPE, ROOT ('languages')
GO
| (无列名) | | :------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------- | | enenglishfr法语 |

dbfiddle here

【讨论】:

  • 这很好用——我想不通的一件事是如何在这个场景中添加一个 order by 子句。尝试按 lang 表按 asc 顺序排序,最后为 null。目前,null 确实排在最后,但结果没有顺序。当我尝试添加一个时,我收到错误消息:“ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP、OFFSET 或 FOR XML。”
  • 可以加top 100 percentdbfiddle.uk/…下单
  • 谢谢,我试了一下,但由于某种原因,顺序仍然不正确。我试图在您的查询中添加更多示例来测试它,但我看不到如何编辑它。你的小提琴以与结果相同的顺序显示,所以我只想添加更多,看看你的排序是否正确。
  • 请把链接发到dbfiddle,我会尽力解决的。
  • 实际上我只是想通了,我将订单移到了外部选择中,效果很好。
【解决方案2】:

尝试直接插入空值,而不是使用单独的表。试试:

UNION ALL SELECT 'PCS','LTR','1'

来自How to use union all with manual value (not from another tabel)?

注意:已编辑答案

【讨论】:

  • 他正在将一串“Null”和一个空值插入到值字段INSERT INTO @nulls ( fieldLabel , fieldValue ) VALUES ( 'NULL' , NULL )
猜你喜欢
  • 2017-11-02
  • 1970-01-01
  • 2011-06-13
  • 2015-07-08
  • 2013-07-29
  • 2013-06-07
  • 2019-05-08
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多