2013-09-27 5 views
1

Я хотел бы знать, как использовать другой пункт WHERE на основе CASE или IF. Я бы предпочел CASE, так как остальная часть утверждения сложна, и мне не нравится идея о том, что эта сложность находится в двух местах с незначительной разницей. Тем не менее, я знаю, что случаи используются только для значений. Я воспроизвел простую версию моей проблемы ниже.Использование двух разных статей:

По существу, у меня есть три стола. Первая содержит основную информацию (MasterTable). Второй содержит отношение «один ко многим», принадлежащее главной таблице (Таблица 1). Третий - это список селекторов, указывающих, какие из записей в таблице 1 должны использоваться в этом случае. Я хочу, чтобы самая последняя запись таблицы2 управляла тем, что выбрано в таблице 1, причем приоритет отдается SubID над OrderNum.

MasterTable | MasterID, OtherInfo

Таблица1 | T1UniqueId, MasterID, SubID, Текст, OrderNum

Таблица2 | T2UniqueId, MasterID, SubID, OrderNum Дата

SELECT MasterID, OtherInfo, SubID 
FROM MasterTable 
OUTER APPLY(
    SELECT TOP 1 SubID FROM Table1 
    WHERE Table1.MasterID=MasterTable.MasterID 
    CASE 
     WHEN 
     (
      SELECT TOP 1 SubID FROM Table2 
      WHERE Table2.MasterID=MasterTable.MasterID 
      ORDER BY Date DESC 
     ) Is NULL 
     THEN Table1.OrderNum= 
      (
       SELECT TOP 1 OrderNum 
       FROM Table2 
       WHERE Table2.MasterId=MasterTable.MasterId 
       ORDER BY Date DESC 
      ) 
     ELSE Table1.SubId= 
      (
       SELECT TOP 1 SubId 
       FROM Table2 
       WHERE Table2.MasterId=MasterTable.MasterId 
       ORDER BY Date DESC 
      ) 
    END 

) SubData 
+0

Если это будет работать вам все равно потребуется дополнительный 'AND' перед' СЛУЧАЙ 'в вашем' WHERE'-clause, но, к сожалению, 'CASE' не может использоваться таким образом, он просто просто выводит значения из' THEN' и 'ELSE' в выражение внедрения; вы не можете использовать его для вывода условия. – DrCopyPaste

+0

@DrCopyPaste Спасибо. Я знал это немного, но я не уверен, как исправить это, чтобы делать то, что я хочу. Я использовал случай, чтобы проиллюстрировать больше, чем предложить решение. – steventnorris

ответ

1

Один быстрый переписывают это было приводит к следующему:

IF ((SELECT TOP 1 SubID FROM Table2 WHERE Table2.MasterID=MasterTable.MasterID ORDER BY Date DESC) IS NULL) 
BEGIN 
    SELECT 
      MasterID, OtherInfo, SubID 
     FROM MasterTable 
     OUTER APPLY(
      SELECT TOP 1 SubID FROM Table1 
      WHERE 
       Table1.MasterID=MasterTable.MasterID 
       AND Table1.OrderNum = 
       (
        SELECT TOP 1 OrderNum 
        FROM Table2 
        WHERE Table2.MasterId=MasterTable.MasterId 
        ORDER BY Date DESC 
       ) 
     ) SubData 
END 
ELSE 
BEGIN 
    SELECT 
      MasterID, OtherInfo, SubID 
     FROM MasterTable 
     OUTER APPLY(
      SELECT TOP 1 SubID FROM Table1 
      WHERE 
       Table1.MasterID=MasterTable.MasterID 
       AND Table1.SubId= 
       (
        SELECT TOP 1 SubId 
        FROM Table2 
        WHERE Table2.MasterId=MasterTable.MasterId 
        ORDER BY Date DESC 
       ) 
     ) SubData 
END 

Но, как вы отметили, что он выглядит некрасиво, потому что теперь у вас есть, что сложность в двух местах ...

Я думаю, вы могли бы также сформулировать это так (непроверенный, но это должно держать вашу сложную логику в одном месте):

SELECT 
     MasterID, OtherInfo, SubID 
    FROM MasterTable 
    OUTER APPLY(
     SELECT TOP 1 SubID FROM Table1 
     WHERE Table1.MasterID=MasterTable.MasterID 
     AND 
     (
      (
       (
        SELECT 
          TOP 1 SubID 
         FROM Table2 
         WHERE Table2.MasterID=MasterTable.MasterID 
         ORDER BY Date DESC 
       ) IS NULL 
       AND 
       Table1.OrderNum = 
       (
        SELECT TOP 1 OrderNum 
        FROM Table2 
        WHERE Table2.MasterId=MasterTable.MasterId 
        ORDER BY Date DESC 
       ) 
      ) 
      OR 
      (
       Table1.SubId = 
       (
        SELECT 
          TOP 1 SubId 
         FROM Table2 
         WHERE Table2.MasterId=MasterTable.MasterId 
         ORDER BY Date DESC 
       ) 
      ) 
     ) 
    ) SubData 
0

Если SubID и OrderNum в Table1 и Table2 такие же вы можете использовать простой запрос с вложенным оператора выбора:

select m.MasterID, m.OtherInfo, (
    select top 1 coalesce(t2.SubID, t2.OrderNum) from Table2 t2 
    where t2.MasterID = m.MasterID order by date desc 
) as SubID 
from MasterTable m; 
+0

ordernum и субад разные. SubID - это числовое число, а ordernum указывает размещение в списке. Таким образом, порядок может составлять 1,2,3, а субады - 000111 000222 000333. Я хотел бы выбрать на основе субад, потому что может быть несколько упорядоченных наборов на masterid. – steventnorris

+0

Под моим добавлением я имел в виду, что Table1.SubID = Table2.SubID и Table1.OrderNum = Table2.OrderNum. Если это применимо, просьба дать запрос выше попытки –

+0

Это не дает желаемого ответа из моих данных. Мне не нужно возвращать subId или OrderNum. Мне нужно вернуть то, что оно соответствует в таблице1. – steventnorris

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