0

真的可以用你的帮助!

我有一个查询:

Select *
from Customers
Where Customer_id in (001,002,003)

...你明白了。

我的问题是,例如,如果没有 customer_id 003 的记录,则不会显示任何记录。如何显示“003”并声明未找到记录?我宁愿这样,也不愿根本没有记录显示。

提前谢谢你!

4

5 回答 5

1

在 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

于 2013-11-04T12:06:21.287 回答
1

通常对于这类事情,我有一个函数,它接受一个 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 服务器版本都支持。

于 2013-11-04T12:23:02.093 回答
0

在 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
于 2013-11-04T10:43:02.913 回答
0

您需要做的是查询您要查找的客户 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 不应该以这种方式使用。

于 2013-11-04T10:47:47.857 回答
0

由于复杂性,可能不是最好的解决方案,显然不推荐用于有很多行的表,但是.. 我创建了 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
于 2013-11-04T14:45:22.277 回答