Как я могу записать запрос T-SQL для выполнения в “подобном”?

Я не совсем уверен, что вы пытаетесь сделать, но у меня сложилось впечатление, что вы хотели бы иметь один экземпляр какого-либо объекта, который может «вести себя как» множество различных типов объектов, и вы хотите иметь геттеры, которые позволят вам очень легко просматривать один и тот же объект различными способами. В этом случае я бы предложил создать один метод получения (не свойство), например, так:

public T Get<T>()
{
   return (T)myObject;
}

Тогда вы бы назвали его так:

Foo foo = box.Get<Foo>();
Bar bar = box.Get<Bar>();
// etc...

Две вещи для примечание: это определенно не безопасно для типов, так как вы можете передать любой тип для T, включая типы, для которых приведение не удастся. Вы можете немного ограничить это, например, так:

public T Get<T>() where T : SomeBaseType

, что приведет к ошибке компиляции, если вы попытаетесь использовать тип, несовместимый с SomeBaseType, но я не уверен, что он полностью устойчив. Но, надеюсь, это поможет вам пройти большую часть пути.

Это то, что вы имели в виду?

5
задан Aaron Palmer 13 October 2009 в 13:38
поделиться

9 ответов

Предполагая, что две таблицы каким-то образом связаны.

SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA>
WHERE newTable.[Name] LIKE oldTable.name
6
ответ дан 18 December 2019 в 11:58
поделиться
DECLARE @nt TABLE (NAME VARCHAR(10))
DECLARE @ot TABLE (NAME VARCHAR(10))

INSERT INTO @nt VALUES('Stuart')
INSERT INTO @nt VALUES('Ray')


INSERT INTO @ot VALUES('St%')
INSERT INTO @ot VALUES('Stu%')


SELECT *
FROM @nt n
WHERE EXISTS (SELECT *
                FROM @ot o
                WHERE n.name LIKE o.name)
5
ответ дан 18 December 2019 в 11:58
поделиться

Не очень красиво, но работает:

SELECT DISTINCT newTable. *
ИЗ newTABLE
ПРИСОЕДИНЯЙТЕСЬ к oldTable
НА newTable. "Имя" КАК oldTable.name

2
ответ дан 18 December 2019 в 11:58
поделиться

Я думаю, вам просто нужно удалить подобное, например:

select * from newTable, где [Name] in (выберите имя из oldTable)

1
ответ дан 18 December 2019 в 11:58
поделиться

Thanks everyone. I used the following query, inspired by both LukLed's answer and a comment by Stuart Ainsworth.

SELECT DISTINCT old.code, old.name, new.name, new.code 
FROM newTable new 
JOIN oldTable old
ON new.name LIKE '%' + old.name + '%' 
WHERE new.code <> old.code
ORDER BY old.name, new.name

Performance isn't that great, but it's a one time analysis and it gets the job done.

The reason I chose this over the "EXISTS" version is because it gives me both results from the new and old tables.

1
ответ дан 18 December 2019 в 11:58
поделиться

Имя как Имя? ну, вы не можете делать LIKE и IN одновременно.

Похоже, это хороший кандидат для SOUNDEX

Выполните JOIN с SOUNDEX.

прочтите здесь: http: // msdn .microsoft.com / en-us / library / aa259235% 28SQL.80% 29.aspx

0
ответ дан 18 December 2019 в 11:58
поделиться

Мы сами столкнулись с той же проблемой. Возможно, это не сработает для вас, но решение, которое мы придумали: ВЫБЕРИТЕ [Поля]
ИЗ [Таблица]
ГДЕ [Поле], например "Условие1"
ИЛИ [Поле], например "Condition2"

Не лучшее решение, но оно работает для нас.

0
ответ дан 18 December 2019 в 11:58
поделиться

Если вы используете очень редко используемое перекрестное применение , вы можете легко это сделать.
(украденный код объявления временной таблицы из Стюарта )

2 таблицы не обязательно должны иметь какие-либо отношения, как ответ Мэтьюза .

DECLARE @nt TABLE (NAME VARCHAR(10))
DECLARE @ot TABLE (NAME VARCHAR(10))

INSERT INTO @nt VALUES('Stuart')
INSERT INTO @nt VALUES('Ray')


INSERT INTO @ot VALUES('St%')
INSERT INTO @ot VALUES('Stu%')

select  distinct n.NAME
from    @nt n
    cross apply @ot o
where   n.NAME like o.name
0
ответ дан 18 December 2019 в 11:58
поделиться

Простой удар в темноте, но это ужасно напоминает ситуацию с нескалярными данными. Быстрый пример использования формата csv (SQL Server 2005 и выше):

WITH oldTable ([name])
     AS
     (
      SELECT '003,006,009,012,015'
      UNION ALL
      SELECT '005,015'
     ),
     newTable ([name])
     AS
     (
      SELECT '007'
      UNION ALL
      SELECT '009'
      UNION ALL
      SELECT '015'
     )
SELECT N1.[name]
  FROM newTable AS N1
 WHERE EXISTS (
               SELECT * 
                 FROM oldTable AS O1
                WHERE ',' + O1.[name] + ','
                         LIKE '%,' + N1.[name] + ',%' 
              );
0
ответ дан 18 December 2019 в 11:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: