我正在尝试运行以下查询,但我不确定如何将其限制为仅一个结果.在下面的查询中,clientcontactid 21901工作的客户端有2个地址,意味着返回2个结果.
查询:
select cc.contactpersonid,
cc.clientcontactid,
ad.city,
ad.addressid
from SavedList sl
inner join ClientContacts cc on cc.ContactPersonId = sl.ObjectId
inner join Clients c on c.ClientID = cc.ClientId
inner join Address ad on c.ClientID = ad.ObjectId
where sl.SavedListId = 2117
Run Code Online (Sandbox Code Playgroud)
结果:
contactpersonid clientcontactid city addressid
87934 21901 145186
87934 21901 London 1130705
89778 17275 Leeds 145368
Run Code Online (Sandbox Code Playgroud)
我需要为客户联系21901返回其中一个结果,优先级是其中包含城市的结果.我已经尝试过选择top(1),但我认为这取决于连接强制多个记录.有关如何仅返回1个结果的任何帮助,以及如何控制它将受到高度赞赏!
谢谢
我是oracle工作脚本的新手.我写了一些清除程序来清理所有旧数据并保留最近3个月的数据...程序执行成功.我也在手动调用时工作.程序如下:
CREATE OR REPLACE PROCEDURE Archive
IS
v_query varchar2(2048);
v_tablename VARCHAR2(50);
v_condition varchar2(50);
TYPE cur_typ IS REF CURSOR;
c cur_typ;
BEGIN
OPEN c for 'select tablename,columnname from pseb.purge_tables';
FETCH c INTO v_tablename,v_condition;
LOOP
EXIT WHEN c%NOTFOUND;
if(v_tablename ='cfw.DCTBLPERFCUMULATIVEMASTER') then
v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB3MAINREG where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90';
execute immediate v_query;
v_query:='delete from cfw.DCTBLPERFDCUMULATIVEB4TODENERG where cumulativeid in (select cumulativeid FROM '|| v_tablename || ' WHERE ' || v_condition||' < sysdate-90'; …Run Code Online (Sandbox Code Playgroud) SELECT top 1
case
when VR = -99999.99
then 0
else cast((VR*1.732) as decimal(38,3))
end
FROM pseb.dbo.datasource
where FeederID=5003
order by datetime desc
Run Code Online (Sandbox Code Playgroud)
上面的查询工作正常,但我需要返回varchar值' - '而不是返回0
如果我喜欢那样的话
SELECT top 1
case
when VR = -99999.99
then '--'
else cast((VR*1.732) as decimal(38,3))
end
FROM pseb.dbo.datasource
where FeederID=5003
order by datetime desc
Run Code Online (Sandbox Code Playgroud)
表示它返回以下错误:
消息8114,级别16,状态5,行1错误将数据类型varchar转换为数字.
请帮我解决一下
如果使用带有子查询的select case语句将else语句改为单个查询,我需要更改以下过程...
if((select COUNT(*) from pseb.dbo.meterattributedetails where meterid=@meterid)=0)
select @emf=EMF from pseb.dbo.METERMASTER where MeterID=@meterid
else if((select COUNT(*) from pseb.dbo.meterattributedetails where meterid=@meterid and dateadd(day,1,@fromdate)<DateTime)>0)
select top 1 @emf=oldvalue from pseb.dbo.meterattributedetails where MeterID=@meterid and dateadd(day,1,@fromdate)<datetime order by DateTime
else
select top 1 @emf=newvalue from pseb.dbo.meterattributedetails where meterid=@meterid and DateTime<@fromdate order by DateTime desc
Run Code Online (Sandbox Code Playgroud)
meterattribute表结构如下:
AttributeID AttributeName Oldvalue newvalue DateTime meterid
1 EMF 2.00000 4.00000 2012-07-05 4756
1 EMF 4.00000 6.00000 2012-07-10 4756
1 EMF 6.00000 8.00000 2012-07-15 4756
1 EMF 8.00000 10.00000 …Run Code Online (Sandbox Code Playgroud)