真的可以用你的帮助!
我有一个查询:
Select *
from Customers
Where Customer_id in (001,002,003)
...你明白了。
我的问题是,例如,如果没有 customer_id 003 的记录,则不会显示任何记录。如何显示“003”并声明未找到记录?我宁愿这样,也不愿根本没有记录显示。
提前谢谢你!
真的可以用你的帮助!
我有一个查询:
Select *
from Customers
Where Customer_id in (001,002,003)
...你明白了。
我的问题是,例如,如果没有 customer_id 003 的记录,则不会显示任何记录。如何显示“003”并声明未找到记录?我宁愿这样,也不愿根本没有记录显示。
提前谢谢你!
在 SQL Server 2008+ 中,您可以使用
SELECT V.Customer_id,
C.*
FROM (VALUES(1),
(2),
(3)) V(Customer_id)
LEFT JOIN Customers C
ON C.Customer_id = V.Customer_id
列中将有不匹配NULL
的值C.Customer_id
。
通常对于这类事情,我有一个函数,它接受一个 csv 并为我返回一个表。然后我做类似下面的事情。
-- this is creating the temporary table which would normally be created by a function.
DECLARE @Temp TABLE (Customer_id int)
INSERT INTO @Temp(Customer_id)
SELECT 1
INSERT INTO @Temp(Customer_id)
SELECT 2
INSERT INTO @Temp(Customer_id)
SELECT 3
-- now do the select statement.
SELECT
T.Customer_id,
C.*
FROM
Customers C
RIGHT OUTER JOIN
@Temp T
ON
T.Customer_id = C.Customer_id
然后,这将为您提供结果,如果C.Customer_id
是,NULL
那么它不是Id
存在于您的Customer
table
. 这与@MartinSmith 所做的工作相同,但大多数 SQL 服务器版本都支持。
在 oracle 中,您可以执行以下操作:
with vals as
(SELECT '001' as val
from dual
union
select '002'
from dual
union
select '030' from dual)
select v.val, nvl(c.Customer_id, 'no Customer found') from vals v left join Customers c on c.Customer_id = v.val
您需要做的是查询您要查找的客户 ID 列表(包括那些可能不存在的客户 ID),然后将其与您的customers
表连接起来。创建您要查询的客户 ID 的临时表是特定于平台的,但这是我在 Oracle 中的操作方式:
with customersToLookup as (
select '001' as customer_id from dual union all
select '002' as customer_id from dual union all
select '003' as customer_id from dual
)
select customersToLookup.customer_id,
customers.*
from customersToLookup
left join customers
on customers.customer_id = customersToLookup.customer_id;
根据我的经验,运行这样的查询是非常不寻常的:RDBM 不应该以这种方式使用。
由于复杂性,可能不是最好的解决方案,显然不推荐用于有很多行的表,但是.. 我创建了 2 个新的临时表:#tempTab2(我在其中保存了已发送的 id)和 #tempTabFinal(其中如果 ID 存在,我保存了对应于该 ID 的行,如果不存在,则保存“未找到消息”)。这是一个打印屏幕,看看这是否是你要做的,以及代码(我用于测试'问题表,列:q_id 和 question - 实际问题)
DECLARE @INSTR as VARCHAR(MAX)
SET @INSTR = '1,153,154,1555,111,'
DECLARE @SEPERATOR as VARCHAR(1)
DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
SET @SEPERATOR = ','
CREATE TABLE #tempTab2 (id int not null,question varchar(60))
CREATE TABLE #tempTabFinal(id varchar(40) not null,question varchar(60))
WHILE PATINDEX('%' + @SEPERATOR + '%', @INSTR ) <> 0
BEGIN
SELECT @SP = PATINDEX('%' + @SEPERATOR + '%',@INSTR)
SELECT @VALUE = LEFT(@INSTR , @SP - 1)
SELECT @INSTR = STUFF(@INSTR, 1, @SP, '')
INSERT INTO #tempTab2 (id,question) VALUES (@VALUE,'question')
END
DECLARE @INDEX INT
SET @INDEX = 1
WHILE (@INDEX <=5)
BEGIN
IF((Select COUNT(*) FROM questions Where q_id= (SELECT TOP 1 id from #tempTab2)) >0 )
BEGIN
DECLARE @TEMP as varchar (80)
SET @TEMP = (Select question from questions where q_id = (SELECT TOP 1 id from #tempTab2))
DECLARE @ID INT
SET @ID = (SELECT TOP 1 id from #tempTab2)
Insert into #tempTabFinal Values(@ID,@Temp)
END
ELSE
BEGIN
DECLARE @NOTFND as Varchar(20)
SET @NOTFND = (SELECT TOP 1 id from #tempTab2)
Insert into #tempTabFinal Values('id ' +@NOTFND + ' Not found ','Not found')
END
DELETE TOP (1) from #tempTab2
SET @INDEX = @INDEX + 1
END
Select * from #tempTabFinal
DROP TABLE #tempTab2
DROP TABLE #tempTabFinal