Я не совсем уверен, что вы пытаетесь сделать, но у меня сложилось впечатление, что вы хотели бы иметь один экземпляр какого-либо объекта, который может «вести себя как» множество различных типов объектов, и вы хотите иметь геттеры, которые позволят вам очень легко просматривать один и тот же объект различными способами. В этом случае я бы предложил создать один метод получения (не свойство), например, так:
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
, но я не уверен, что он полностью устойчив. Но, надеюсь, это поможет вам пройти большую часть пути.
Это то, что вы имели в виду?
Предполагая, что две таблицы каким-то образом связаны.
SELECT newTable.* FROM newTABLE JOIN oldTable ON <JOIN CRITERIA>
WHERE newTable.[Name] LIKE oldTable.name
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)
Не очень красиво, но работает:
SELECT DISTINCT newTable. *
ИЗ newTABLE
ПРИСОЕДИНЯЙТЕСЬ к oldTable
НА newTable. "Имя" КАК oldTable.name
Я думаю, вам просто нужно удалить подобное, например:
select * from newTable, где [Name] in (выберите имя из oldTable)
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.
Имя как Имя? ну, вы не можете делать LIKE и IN одновременно.
Похоже, это хороший кандидат для SOUNDEX
Выполните JOIN с SOUNDEX.
прочтите здесь: http: // msdn .microsoft.com / en-us / library / aa259235% 28SQL.80% 29.aspx
Мы сами столкнулись с той же проблемой. Возможно, это не сработает для вас, но решение, которое мы придумали:
ВЫБЕРИТЕ [Поля]
ИЗ [Таблица]
ГДЕ [Поле], например "Условие1"
ИЛИ [Поле], например "Condition2"
Не лучшее решение, но оно работает для нас.
Если вы используете очень редко используемое перекрестное применение
, вы можете легко это сделать.
(украденный код объявления временной таблицы из Стюарта )
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
Простой удар в темноте, но это ужасно напоминает ситуацию с нескалярными данными. Быстрый пример использования формата 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] + ',%'
);