1

我试图找到一种解决方法(hack)来解决一些限制,这些限制阻止我在我的 SQL 查询中使用临时表或表变量。

我有一个真实的表(从技术上讲,它是一个派生表,它是由一个设计不佳的表的 UNPIVOT 产生的),它缺少几个必要的字段。我需要将这些字段硬编码到结果中,直到我们可以清理数据库问题。

给定一个像这样的表:

tblEntity
ID | Name
 1 |  One
 2 |  Two

我需要加入几个领域,例如:

ID | Order
 1 |     2
 2 |     1

加入将导致:

ID | Name | Order
 1 |  One |     2
 2 |  Two |     1

我的问题是:我可以将 tblEntity 加入到创建的结果集中,例如:

SELECT 1, 2
UNION ALL
SELECT 2, 1

是否可以加入?如果是这样,语法是什么?

4

4 回答 4

2

做一些假设,这会做到:

SELECT en.ID, en.Name, xx.OrderBy
 from tblEntity en
  inner join (select 1 Id, 2 OrderBy
              union all
              select 2,1) xx
   on xx.Id = en.ID
于 2011-12-15T23:35:30.420 回答
2
select te.*, t.Ord from tblEntity te
inner join (
    SELECT 1 as Id, 2 as Ord
    UNION ALL
    SELECT 2, 1
) t on te.ID = t.Id
于 2011-12-15T23:35:38.930 回答
2

在 SQL-Server 2008 中,也可以使用Table Value Constructors

CREATE TABLE #tblEntity
( ID INT
, Name CHAR(10)
) ;

INSERT INTO #tblEntity
  (ID, Name)
VALUES
  ( 1, 'One' ) ,
  ( 2, 'Two' ) ;

SELECT 
    t.ID, t.Name, o.Ordr AS "Order"
FROM 
        #tblEntity AS t
    JOIN
        ( VALUES
             (1,2)
           , (2,1)
        ) AS o(ID, Ordr)
      ON o.ID = t.ID ;

您可以在以下位置测试上述内容:data.stackexchange.com

于 2011-12-15T23:47:55.217 回答
0

许多方法可以做到这一点,例如

WITH T1 (Id, "Order")
     AS 
     (
      SELECT 1, 2
      UNION ALL
      SELECT 2, 1
     )
SELECT e.*, T1."Order"
  FROM tblEntity e 
       JOIN T1 
          ON e.Id = T1.Id;

例如 2

SELECT e.*, T1."Order"
  FROM tblEntity e 
       JOIN (
             VALUES (1, 2), 
                    (2, 1)
            ) AS T1 (Id, "Order")
          ON e.Id = T1.Id;

例如 3

WITH T1 
     AS 
     (
      SELECT * 
        FROM (
              VALUES (1, 2), 
                     (2, 1)
             ) AS T (Id, "Order")
     )
SELECT e.*, T1."Order"
  FROM tblEntity e 
       JOIN T1 
          ON e.Id = T1.Id;

...等等。

于 2011-12-16T08:44:33.640 回答