繁体   English   中英

SQL语句有条件地选择相关记录

[英]SQL statement to conditionally select related records

我有一个表,其中包含字段id (主键)和fid 我想获取id匹配特定值的记录,以及具有相同fid值的所有相关记录。

我可以做这个:

SELECT * FROM mytable 
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue')

但是如果fid是一个特定值(在我的情况下为空的guid值),我不希望相关记录。

有没有办法在单个SQL语句中执行此操作? 我正在使用SQL Server 2008 R2。

更新:

看到目前为止的答案,我想我可能没有清楚地问过我的问题。 idfid将永远不相等。 可能需要LEFT JOIN ,但我对SQL有点不了解。 我希望将以下两个查询作为单个语句:

SELECT * FROM mytable WHERE id = 'somevalue' 

SELECT * FROM mytable WHERE fid = 
    (SELECT TOP 1 fid FROM mytable 
     WHERE id = 'somevalue' AND fid != '00000000-0000-0000-0000-000000000000')  

根据您的修订,问题似乎是“选择id具有特定值的所有行,而具有id所有其他行匹配“ somevalue”且fid不为null。

以下内容捕获了此逻辑:

SELECT t.*
FROM mytable t left outer join
     (SELECT TOP 1 fid
      FROM mytable 
      WHERE id = 'somevalue' AND fid <> '00000000-0000-0000-0000-000000000000'
     ) t1
     on t.fid = t1.fid
WHERE id = 'somevalue' or t1.fid is not null;

由于id是主键,因此t1子查询将返回0或1行。 当它返回0行时,您只会得到与'somevalue'相匹配的原始行。

我认为这是您想要做的:

SELECT * 
FROM mytable a
JOIN mytable b ON a.id = b.fid
WHERE a.id = 'somevalue';

这应该返回a中的所有记录(与b中的所有记录(其中a.id = b.fid一起)一起返回),然后进行过滤以仅显示a.id ='somevalue'的记录;

您可以像这样在您的sql语句中添加另一个子句:

SELECT * From mutable
WHERE fid = (SELECT TOP 1 fid FROM mytable WHERE id = 'somevalue' 
AND fid != '00000000-0000-0000-0000-000000000000')

如果要多行,请尝试按@zigdawgydawg的建议加入。

我不确定我是否理解您的问题,但我会采取行动。 我想您要问的是,是否可以从一个表中选择id或fid字段等于特定值的所有记录,但是如果要搜索的特定值等于空,则不希望相关字段指导价值。 如果是这样,请按照以下步骤操作:

SELECT
    *
FROM
    mytable t1
LEFT JOIN
    mytable t2 ON (t1.id = t2.fid) AND (t2.fid IS NOT NULL);

这是您要找的东西吗?

也许这就是您所追求的:

select * from mytable
where id = 'somevalue' 
or id = (select fid from mytable where id = 'somevalue')    

几乎像zigdawgydawg的贡献一样,但略有不同:

SELECT * FROM mytable WHERE fid IN 
(SELECT fid FROM mytable WHERE id = 'somevalue' )
AND NOT guid is null;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM