从表中检索SQL

从表中检索SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张像这样的桌子 EMPLOYEE_ID DTL_ID COLUMN_A COLUMN_B --------------------------- JOHN 0 1 1 JOHN 1 3 1 LINN 0 1 12 SMITH 0 9 1 SMITH 1 11 12 这

我有一张像这样的桌子

EMPLOYEE_ID DTL_ID COLUMN_A COLUMN_B
---------------------------
JOHN        0       1           1
JOHN        1       3           1
LINN        0       1           12
SMITH       0       9           1
SMITH       1       11          12
这意味着每个人都会有一个或多个记录具有不同的
DTL\u ID
值(0、1、2..等)

现在,我想创建一个T-SQL语句来检索具有
EMPLOYEE\u ID
DTL\u ID
的记录

如果未找到指定的
DTL\u ID
,将返回
DTL\u ID=0
的记录

我知道我可以通过各种方式来实现这一点,例如首先通过
exists
COUNT(*)检查行是否存在,然后检索行

但是,我想知道其他可能的方法,因为这个检索语句在我的应用程序中非常常见,并且我的表有十万行

在上述方法中,即使指定了
DTL\u ID
的记录存在,我也必须检索两次,我希望避免这种情况。

在最终的
选择
查询中使用
ISNULL(DTL\u ID,0)
在最终的
选择
查询中使用
ISNULL(DTL\u ID,0)
,如下所示:

  SELECT *
    FROM table
   WHERE EMPLOYEE_ID = ?? AND DTL_ID = ??
UNION
  SELECT *
    FROM table
   WHERE EMPLOYEE_ID = ?? AND DTL_ID = 0
     AND NOT EXISTS (SELECT *
                       FROM table
                      WHERE EMPLOYEE_ID = ?? AND DTL_ID = ??)
您当然需要填写??用正确的数字。

像这样:

  SELECT *
    FROM table
   WHERE EMPLOYEE_ID = ?? AND DTL_ID = ??
UNION
  SELECT *
    FROM table
   WHERE EMPLOYEE_ID = ?? AND DTL_ID = 0
     AND NOT EXISTS (SELECT *
                       FROM table
                      WHERE EMPLOYEE_ID = ?? AND DTL_ID = ??)
SELECT E1.EMPLOYEE_ID, ISNULL(E2.DTL_ID, 0), E1.COLUMN_A, E1.COLUMN_B EMPLIYEES AS E1
LEFT JOIN EMPLIYEES AS E2
ON E1.EMPLOYEE_ID = E2.EMPLOYEE_ID AND E2.DTL_ID = 42

您当然需要填写??使用正确的数字。

如果DTL\u ID始终为0或正:

SELECT E1.EMPLOYEE_ID, ISNULL(E2.DTL_ID, 0), E1.COLUMN_A, E1.COLUMN_B EMPLIYEES AS E1
LEFT JOIN EMPLIYEES AS E2
ON E1.EMPLOYEE_ID = E2.EMPLOYEE_ID AND E2.DTL_ID = 42
SELECT TOP 1 * FROM table
where EmployeeID = @EmployeeID and DTL_ID in (@DTL_ID,0)
order by DTL_ID desc

如果您在一个查询中跨多个员工工作,等等,那么如果您的SQL版本支持,您可能希望使用ROW_NUMBER()。

如果DTL_ID始终为0或正:

SELECT TOP 1 * FROM table
where EmployeeID = @EmployeeID and DTL_ID in (@DTL_ID,0)
order by DTL_ID desc

如果您在一个查询中跨多个员工工作,等等,那么如果您的SQL版本支持,您可能希望使用ROW_NUMBER()。

您可以使用
top
union
,例如:

declare @t table(id int, value int, c char)
insert @t values (1,0,'a'), (1,1,'b'), (1,2,'c')

declare @id int = 1;
declare @value int = 2;

select top(1) *
from
(
    select *
    from @t t
    where t.value =  @value and t.id = @id

    union all

    select *
    from @t t
    where t.value = 0

)a
order by a.value desc

如果
@value=2
,则查询返回
12c
。如果
@value=3
,则查询返回
10a

您可以使用
top
union
,例如:

declare @t table(id int, value int, c char)
insert @t values (1,0,'a'), (1,1,'b'), (1,2,'c')

declare @id int = 1;
declare @value int = 2;

select top(1) *
from
(
    select *
    from @t t
    where t.value =  @value and t.id = @id

    union all

    select *
    from @t t
    where t.value = 0

)a
order by a.value desc


如果
@value=2
,则查询返回
12c
。如果
@value=3
,则查询将返回表中的
10a

“如果未找到指定的DTL\u ID”-“找到位置”。例如,从EMPLOYEE_ID='LINN'和DTL_ID='1'的位置选择*。此语句返回DTL_ID=0的记录。当然,从表中可以找到“如果未找到指定的DTL_ID”-“找到位置”。例如,从EMPLOYEE_ID='LINN'和DTL_ID='1'的位置选择*。此语句返回DTL_ID=0的记录。他想要DTL_ID=0的行。如果查询不返回任何行,ISNULL将不起作用。这取决于他将使用的查询,我相信这里应该在另一个表上进行左/右连接。我想要的是整行,而不是单个DTL\U ID列。@Kai:因此,如果您在DTL\U ID上连接另一个表,请将SELECT语句中的DTL\U ID替换为ISNULL(DTL\U ID,0)-它将用0替换所有空值。他希望该行的DTL_ID=0。如果查询不返回任何行,ISNULL将不起作用。这取决于他将使用的查询,我相信这里应该在另一个表上进行左/右连接。我想要的是整行,而不是单个DTL\U ID列。@Kai:因此,如果您在DTL\U ID上连接另一个表,请将SELECT语句中的DTL\U ID替换为ISNULL(DTL\U ID,0)-它将所有空值替换为0。我认为,这一个更好。抱歉,Damien,但如果DTL_ID值超过2个(0,1,2),这将不起作用。Damien是正确的。这正是我想要的。如果没有指定DTL_ID的记录,我希望默认情况下得到DTL_ID=0。如果找不到指定的ID,我不希望得到另一个LANG_ID(非空)的行。@t-clausen.dk-对不起,我不知道你的意思。@Damien没关系,我误解了这个问题。我假设OP想要所有不是0的行。很好的解决方案。在我的解答中,你可以看到我是如何阅读这个问题的。谢谢。我认为,这一个更好。抱歉,Damien,但如果DTL_ID值超过2个(0,1,2),这将不起作用。Damien是正确的。这正是我想要的。如果没有指定DTL_ID的记录,我希望默认情况下得到DTL_ID=0。如果找不到指定的ID,我不希望得到另一个LANG_ID(非空)的行。@t-clausen.dk-对不起,我不知道你的意思。@Damien没关系,我误解了这个问题。我假设OP想要所有不是0的行。很好的解决方案。在我的解答中,你可以看到我是如何理解这个问题的。