SmartDeveloping Ответов: 2

Используйте дело &ампер; когда заявление


У меня есть временная таблица в виде таблицы 1 со следующими полями:

Идентификатор учетной записи, идентификатор клиента, состояние
4564640 252 Техас
4561210 257 WI
4564620 253 TX
4564720 259 Нм

Вот чего я пытаюсь достичь: мне нужно найти каждого клиента с его идентификатором учетной записи с другого сервера в соответствии с его состоянием из таблицы 2, чтобы получить правильный "CustomerID" и, используя этот идентификатор, проверить в таблице 3, действительно ли этот клиент действителен или нет.

Что я уже пробовал:

SELECT CAST(
            CASE
                WHEN LocationState = 'TX'
                        THEN

CHill60

Как выглядят таблицы 2 и 3?

SmartDeveloping

Таблица 2-это таблица контактов:
Идентификатор учетной записи, имя и т. д.. Мне нужно попасть в эту таблицу, чтобы подобрать правильный CustomerID

Таблица 3:
CustomerID, ActiveCustomer... Таблица, где я могу видеть все транзакции клиента.

CHill60

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

SmartDeveloping

Да нет вроде бы.

Bryian Tan

во всяком случае, не в состоянии опубликовать решение. Увидеть, если это будет работать.

-Просто размышляю вслух, как насчет вызова функции? Но также проверьте, будет ли производительность проблемой."

Пример:
Скрыть   скопировать код

CASE 
	WHEN LocationState = 'TX' THEN
		(
			SELECT returnCol FROM  [dbo].[YourTXFuncCustomerAccountCheck](Account ID, CustomerID, State)

WHEN LocationState = 'MD' THEN
		(
			SELECT returnCol FROM  [dbo].[YourMDFuncCustomerAccountCheck](Account ID, CustomerID, State)		
		)

SmartDeveloping

Где бы я дал знать запросу, что я забираю LocationState из временной таблицы.

Bryian Tan

Таблица 1, я полагаю. Это то, что вы опубликовали,
ВЫБЕРИТЕ АКТЕРСКИЙ СОСТАВ(
ДЕЛО
Когда LocationState = 'TX'
ЗАТЕМ
...
Я думаю, здесь у вас будет Из Табл. 1???

2 Ответов

Рейтинг:
0

Maciej Los

Вам не нужно использовать CASE ... WHEN ... THEN ... END заявление. Вам нужно использовать JOIN'ы. Увидеть: Визуальное представление SQL-соединений[^]

SELECT t1.<FirstField1>, t2.<AnotherField>
FROM [dbo1].Table1 AS t1 <LEFT|RIGHT> JOIN [dbo2].Table2 AS t2 ON t1.KeyField = t2.OtherKeyField


Мы не можем предоставить более подробную информацию из-за неполной информации о данных.


Рейтинг:
0

CHill60

Я все равно собираюсь опубликовать это сейчас - это то, что я пытался опубликовать раньше. Извинения - в нем содержится много того, что сказали другие
e техника, которую вы ищете, - это соединение - см. Эту статью Визуальное представление SQL-соединений[^]

Нет никакой необходимости использовать CASE, и я понятия не имею, почему вы пытаетесь что-то бросить.

Судя по вашему описанию таблиц, вы допускаете ошибки в схеме базы данных. флаг ActiveCustomer-это функция контакта или клиента нет операции для клиента. Вам нужно почитать дальше Нормализация Базы Данных[^]

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

Я использовал несколько примеров таблиц, которые выглядят следующим образом:

create table table1
(
	[Account ID] varchar(7), 
	CustomerID int, 
	[State] varchar(3)
)
insert into table1 values
('4564640', 252, 'TX'),
('4561210', 257, 'WI'),
('4564620', 253, 'TX'),
('4564720', 259, 'NM')

create table contact
(
	[Account ID] varchar(7),
	[CustomerID] int,
	ActiveCustomer bit,
	FirstName varchar(50)
	-- other contact fields
)
insert into contact values
('4564640', 252, 1, 'John'), --active
('4564620', 253, 0, 'Fred')  -- not active

create table [transactions]
(
	[CustomerID] int,
	transdate date
	-- other transaction fields
)

insert into transactions values
(252, getdate()),
(252, getdate()),
(253, getdate())
Все, что вам нужно сделать, это сделать соединение через стол, чтобы получить необходимую вам информацию:
lect c.CustomerID, t1.[Account ID], FirstName, [State], CASE WHEN ActiveCustomer = 1 THEN 'Active' ELSE 'Inactive' END AS [status]
from transactions t
inner join contact c on t.CustomerID = c.CustomerID
inner join table1 t1 on t1.[Account ID] = c.[Account ID]

Вы можете включить предложение WHERE, чтобы опустить неактивных клиентов, если хотите:
WHERE c.ActiveCustomer = 1
Если одна или несколько таблиц находятся на другом сервере, вам просто нужно убедиться, что вы используете полные имена таблиц
напр.
MyOtherServer.DatabaseName.schemaname.tablename
Возможно, вам придется настроить серверы следующим образом: Связанные Серверы (Компонент Database Engine)[^]


Maciej Los

5ед!
Я был ленив. Мой ответ гораздо короче.

CHill60

Спасибо. Я был готов к этому 3 часа назад, но на сайте возникла проблема - я отправил Шону электронное письмо напрямую, так как даже не мог опубликовать эту проблему в Bugs&Sugs! :-)
Теперь я замечаю, что там, где я его вставил, отсутствуют странные символы *вздох*

Maciej Los

;)