2013-10-14 4 views
0

E.g. :Есть ли способ проверить, равно ли несколько полей из JOIN?

У меня есть запрос:

select coalesce(VV1.[TimeStamp], VV2.[TimeStamp]...) as MyDate, V1, V2, .. VN 
    from VV1 
    full join VV2 
    full join VV3 
    ... 
    full outer join VVN 
    on VV1.TimeStamp = VV2.TimeStamp 
    and VV2.TimeStamp = VV3.TimeStamp 
    ... 
    and VVN-1.TimeStamp = VVN.TimeStamp 

Я хочу, чтобы создать его в виде строки, но это комплекс с on части ... Так

  • Можно ли записать его в лучшую сторону?
  • может быть как-то написать on AllOfThemAreEqual(VV1.TimeStamp, VV2.TimeStamp .. VVN.TimeStamp)? Но я сомневаюсь, что это возможно :(
  • Может быть, это возможно, чтобы сохранить предыдущее значение в переменном темпе, а затем извлечь оттуда Этот последний вариант выглядит наиболее реальным для меня

SQLFibble:. http://sqlfiddle.com/#!6/4e138/3/0

CREATE TABLE T1(
    [ValueId] [bigint] IDENTITY(1,1) NOT NULL, 
    [PointId] [int] NULL, 
    [Value] [int] NULL, 
    [TimeStamp] [datetime] NULL 
); 

INSERT INTO T1 
      ([PointId] 
      ,[Value] 
      ,[TimeStamp]) 
    VALUES 
      (1, 1, 1900-01-01) 
INSERT INTO T1 
      ([PointId] 
      ,[Value] 
      ,[TimeStamp]) 
    VALUES 
      (2, 2, 1900-01-01) 
; 

и

WITH VV1 AS (
      SELECT [TimeStamp], [Value] AS V1 FROM T1 
      WHERE [PointId] = 1 
     ), VV2 AS (
      SELECT [TimeStamp], [Value] AS V2 FROM T1 
      WHERE [PointId] = 2 
     ) 
SELECT 
    coalesce(VV1.[TimeStamp], VV2.[TimeStamp]) AS dt 
    , V1, V2 
FROM VV1 
FULL JOIN VV2 
ON VV1.TimeStamp = VV2.TimeStamp 
+1

Случаи использования полного внешнего соединения мало, и далеко друг от друга в большинстве реальных приложений. Если вы видите его, в вашей голове должен появиться предупреждающий звонок. Не используйте их легкомысленно. – Tomalak

+0

Почему «FULL OUTER» присоединяется вместо «INNER»? – gvee

+0

INNER не возвращает данные ... они не пересекаются, но «полное соединение» вернет те же данные. – Cynede

ответ

3

Использование скрипку: http://sqlfiddle.com/#!6/4e138/3/0

Вот другой подход. Нет необходимости в дополнительных объединениях, просто дает вам одну строку за Timestamp.

SELECT "Timestamp" 
    , Max(CASE WHEN PointId = 1 THEN "Value" END) As V1 
    , Max(CASE WHEN PointId = 2 THEN "Value" END) As V2 
    , Max(CASE WHEN PointId = 3 THEN "Value" END) As V3 
    , Max(CASE WHEN PointId = 4 THEN "Value" END) As V4 
    , Max(CASE WHEN PointId = 5 THEN "Value" END) As V5 
FROM t1 
GROUP 
    BY "Timestamp" 

Пожалуйста, попытайтесь избежать динамического SQL везде, где это возможно

+0

Честно говоря, это все еще неправильно, так как это вызовет проблемы, когда есть более одной таблицы :) – Cynede

+0

@На ваш исходный вопрос не указан этот факт, поэтому предоставленное решение не подходит для этого. Казалось бы, вы злоупотребляете динамическим SQL, который чаще всего является признаком недостатка вашего дизайна/решения. Возможно, вам нужно вернуться к чертежной доске? – gvee

+0

Мне удалось сделать это :) сложным способом с полным объединением, но он работает так, как я этого хотел. – Cynede

Смежные вопросы