0

我希望从我存储的过程中返回一组数据,但结果只是返回两组中的第一个。如何从以下仅返回一组数据:

SELECT TOP 1 categoryname, displaypartno
FROM Categories
WHERE catalogid = @CatalogID AND source = @Manufacturer
ORDER BY categoryid DESC

IF @@RowCount=0
BEGIN
    SELECT '' AS categoryname, displaypartno
    FROM Products
    WHERE catalogid = @CatalogID AND source = @Manufacturer
END

因为只有当第一个 SQL 没有返回任何行时我才需要执行第二个 SQL,所以我认为我不能使用 UNION。

4

4 回答 4

1

因此,如果您有一个类别或所有匹配的产品行,您想选择一行:

您快到了,但您需要将这两个部分都放在 IF...ELSE 语句中。

IF EXISTS (SELECT * 
           FROM Categories 
           WHERE catalogid = @CatalogID AND source = @Manufacturer) 

    SELECT TOP 1 categoryname, displaypartno
    FROM Categories
    WHERE catalogid = @CatalogID AND source = @Manufacturer
    ORDER BY categoryid DESC

ELSE

    SELECT '' AS categoryname, displaypartno
    FROM Products
    WHERE catalogid = @CatalogID AND source = @Manufacturer

END

不要担心调用它两次,除非你对这个查询有很大的要求,或者在别处做一些愚蠢的事情,它不会引起很大的性能问题。

于 2014-01-16T21:12:26.440 回答
0
SELECT TOP 1 categoryname, displaypartno
FROM (
  SELECT categoryname, displaypartno, 0 AS ResultPriority
  FROM Categories
  WHERE catalogid = @CatalogID AND source = @Manufacturer
  UNION ALL
  SELECT '' AS categoryname, displaypartno, 1 AS ResultPriority
  FROM Products
  WHERE catalogid = @CatalogID AND source = @Manufacturer
) t
ORDER BY ResultPriority, categoryid DESC
于 2014-01-16T20:55:42.700 回答
0

您应该使用 IF NOT EXIST ( ) 函数。

创建一个变量表并添加第一步的返回项。然后,从您在 IF NOT EXIST 条件下创建的变量表中选择所有项目,并记下您的第二步。

如果您不创建变量表,则从类别表中选择冗余选择。

还有为什么你不使用@@ROWCOUNT http://www.johnpapa.net/t-sql-if-not-exists-versus-rowcount/

于 2014-01-16T21:17:24.040 回答
0

这是最好的例子。如果您有多个查询并且如果一个查询出错,那么另一个查询肯定会运行。让我们假设两个查询都给出错误.. 存在多个数据,其中薪水大于 4000,对于 EMP 代码 7500,没有数据存在。

*

Create Or Replace Procedure Proc_Test As
  l_Str_1    Varchar2(2000);
  l_Str_2    Varchar2(2000);
  p_Msg      Varchar2(2000);
  p_Err_Code Varchar2(2000);
  l_Count_1  Number;
  l_Count_2  Number;
Begin
  l_Str_1 := 'Select Sal  From Cmc7 Where Sal > 4000'; 
  l_Str_2 := 'SELECT sal FROM Cmc7 WHERE empno = 7500';
  Begin
    Execute Immediate l_Str_1
      Into l_Count_1;
  Dbms_Output.Put_Line(l_Count_1);
  Exception
    When Too_Many_Rows Then
      Dbms_Output.Put_Line('yahoo... many rows');
  End;
  Begin
    Execute Immediate l_Str_2
      Into l_Count_2;
  Dbms_Output.Put_Line(l_Count_2);
  Exception
    When No_Data_Found Then
      Dbms_Output.Put_Line('sorry...');
  End;
Exception
  When Others Then
    p_Msg      := Sqlerrm;
    p_Err_Code := Sqlcode;
End;

*

输出: 雅虎...很多行对不起...

于 2015-04-17T12:16:21.927 回答