none
Условия в T-SQL RRS feed

  • Вопрос

  • Мне нужно решить по смыслу похожую задачу. Причем как мне кажется, она должна быть реализована с помощью условий.

    Допустим есть таблицы Таблица1 и Таблица2.

    Таблица1 с полями: (int Id; nvarchar(30) Name)

    Таблица2 с полями: (int Id; int Tabl1_Id; bit IsText). Причем поле Tabl1_Id связано с полем Id таблицы Таблица1.

    Допустим я должен реализовать такой алгоритм... Просмотреть пройтись по всем записям Таблицы1, найти соответствующую запись в Таблице2 и в зависимости от значения в поле Таблица2.IsText должен присвоить в Таблица1.Name значение или "Это текст" или "Это не текст".

    Что я имею уже.

    select * from Tabl1,Tabl2  where Tabl1.id=Tabl2.Tabl1_Id 
    GO
    

    Дальше мне нужно как то из полученной таблицы пройтись по всем записям и просмотреть поле IsText, и присвоить в таблицу1 в поле Name соответсвующие значения

    Спасибо заранее за помощь

    27 сентября 2013 г. 11:26

Ответы

  • Вы потенциально идёте к большим проблемам с производительностью, как минимум. В большом проценте случаев, когда оказывается НЕОБХОДИМЫМ использовать курсоры, следует остановиться и подумать над тем, стоит ли вообще решать эту задачу при помощи T-SQL.
    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 15:54
  • Добрый день.

    Я бы сделал два update, как то так:

    update Tabl1 set Text = 'Текст' where id in (select id from Tabl1,Tabl2  where Tabl1.id=Tabl2.Tabl1_Id and Tabl2.IsText = 1)
    update Tabl1 set Text = 'Не текст' where id in (select id from Tabl1,Tabl2  where Tabl1.id=Tabl2.Tabl1_Id and Tabl2.IsText = 0)

    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 11:32
    Отвечающий
  • Ну так и формулируйте задачу так, чтобы было понятно что вы хотите...

    Ну и напишите курсор в котором перебирайте записи и анализируйте их.

    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 11:48
    Отвечающий
  • Э... я не очень понял из вашего комментария, вы про курсоры почитали, они вас устраивают?
    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 12:14
    Отвечающий

Все ответы

  • Добрый день.

    Я бы сделал два update, как то так:

    update Tabl1 set Text = 'Текст' where id in (select id from Tabl1,Tabl2  where Tabl1.id=Tabl2.Tabl1_Id and Tabl2.IsText = 1)
    update Tabl1 set Text = 'Не текст' where id in (select id from Tabl1,Tabl2  where Tabl1.id=Tabl2.Tabl1_Id and Tabl2.IsText = 0)

    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 11:32
    Отвечающий
  • В данной задаче такой вариант прокатит) Но я обобщил свой задачу и представил такую упрощенную, чтобы вас не нагружать ненужной кашей. В моей реальной задаче намного все сложнее. Нужно перебирать все записи и в зависимости от некоторых условий, то есть должно быть много if...else, плюс к тому же, нужно со Таблицы2 брать int значения и присваивать их в Таблицу1

    Вроде я тут начал читать про Курсоры, они похожу могут реализовать то что мне нужно

    • Изменено Higgs.Boson 27 сентября 2013 г. 11:43
    27 сентября 2013 г. 11:41
  • Ну так и формулируйте задачу так, чтобы было понятно что вы хотите...

    Ну и напишите курсор в котором перебирайте записи и анализируйте их.

    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 11:48
    Отвечающий
  • Ну я же сформулировал. Эту задачу нужно решить так. есть select, нужно пройтись по всем записям и в зависимости от некоторых условий, присвоить нужные значения в другую тублицу)
    27 сентября 2013 г. 11:50
  • Э... я не очень понял из вашего комментария, вы про курсоры почитали, они вас устраивают?
    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 12:14
    Отвечающий
  • Да почитал, вроде как устраивают. Попробую написать что-нибудь. 
    27 сентября 2013 г. 12:19
  • Вы потенциально идёте к большим проблемам с производительностью, как минимум. В большом проценте случаев, когда оказывается НЕОБХОДИМЫМ использовать курсоры, следует остановиться и подумать над тем, стоит ли вообще решать эту задачу при помощи T-SQL.
    • Помечено в качестве ответа Higgs.Boson 27 сентября 2013 г. 18:16
    27 сентября 2013 г. 15:54
  • Спасибо. Это некритично для меня, поскольку это одинарная задача. Вопрос можно считать закрытым
    27 сентября 2013 г. 18:16
  • Вы потенциально идёте к большим проблемам с производительностью, как минимум. В большом проценте случаев, когда оказывается НЕОБХОДИМЫМ использовать курсоры, следует остановиться и подумать над тем, стоит ли вообще решать эту задачу при помощи T-SQL.
    А что Вы посоветуете взамен курсорам?
    30 сентября 2013 г. 5:18
  • 1. Переписать на обычные операции с множествами в рамках SQL
    2. Использовать sql server для выборок, а считать снаружи:
    2.1 В application server'е
    2.2 В CLR-процедурах или функциях

    Ну и комбинировать все подходы. В реальности, никакого универсального ответа нет. Надо учитывать конкретную специфику, объёмы данных, требования к concurrency, частоту изменения алгоритмов и т.д.

    30 сентября 2013 г. 12:13
  • Ну и комбинировать все подходы.


    Может, не отказываясь и от курсоров. У нас, например, ночные обработки написаны на курсорах и все нормально работает. Под реальной нагрузкой сервера с 6 утра до 6 вечера, почему бы не потранжирить ресурсы сервера в 3 часа ночи?
    30 сентября 2013 г. 12:16
    Отвечающий
  • Ну так не всегда же есть ночные окна :) И даже без курсоров бывают большие проблемы впихнуть ночные обработки в отведённые им окна. 
    Я, в целом, не против курсоров, конечно. Но за почти 15 лет активного написания самой разнообразной логики на T-SQL практически всегда обходился без них. А в performance-critical вещах так вообще всегда. 
    Да и код с ними выглядит плохо и неэлегантно. :)
    30 сентября 2013 г. 14:18
  • Спасибо за ответы! Все они очень важны для меня
    1 октября 2013 г. 6:49
  • 1. Переписать на обычные операции с множествами в рамках SQL
    2. Использовать sql server для выборок, а считать снаружи:
    2.1 В application server'е
    2.2 В CLR-процедурах или функциях

    Ну и комбинировать все подходы. В реальности, никакого универсального ответа нет. Надо учитывать конкретную специфику, объёмы данных, требования к concurrency, частоту изменения алгоритмов и т.д.

    Вот,вот. Верно подмечено.

    Сделаем содержимое сообщества лучше, вместе!

    4 октября 2013 г. 6:28
    Модератор