SQL - возможно ли объединить таблицу с набором результатов, созданным несколькими select / union-alls? - PullRequest
1 голос
/ 16 декабря 2011

Я пытаюсь найти обходной путь (взлом) к некоторым ограничениям, мешающим мне использовать временную таблицу или переменную таблицы в моем запросе 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 ]

2 голосов
/ 16 декабря 2011
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
2 голосов
/ 16 декабря 2011

В 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

2 голосов
/ 16 декабря 2011

Если сделать несколько предположений, это будет сделано:

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
0 голосов
/ 16 декабря 2011

Многие способы сделать это, например,

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;

... и т. Д.

...