如何从select语句中选择结果的子集

时间:2010-03-30 14:46:03

标签: sql

我有一个存储RDF三元组的表:

三元组(triple_id,sub_id,pre_id,obj_id)

方法(我需要编写)将接收一个与pre_id值对应的数字数组。我想为传入的数组中的所有pre_id选择具有相应pre_id的所有sub_id值。

E.g。如果我传入了一个pre_id值...让我们调用preId中传递的值,我会这样做:

  

从triples中选择sub_id,其中pre_id = preId;

然而,由于我有多个pre_id值,我想继续遍历pre_id值,并且只保留sub_id值对应于具有两者的“三元组”记录。

E.g。图片有五条记录:

triples(1, 34,65,23)
triples(2, 31,35,28)
triples(3, 32,32,19)
triples(4, 12,65,28)
triples(5, 76,32,34)

如果我传入一组pre_id值[65,32],那么我想选择第一,第三,第四和第五条记录。

我该怎么做?

5 个答案:

答案 0 :(得分:5)

这可能不适用于每个数据库,但关键字in可以执行此操作:

select sub_id from triples where pre_id in (65, 32)

答案 1 :(得分:3)

您将传入的数据作为单个字符串接收,按分隔符拆分,然后将其放入@Table并使用JOINEXISTSsub query来获取返回你想要的行。

以下是将字符串拆分为@Table

的方法

T-SQL: Opposite to string concatenation - how to split string into multiple records

SQL 2008中的完全工作示例

DROP FUNCTION dbo.Split
go
CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )
GO
Declare @Triples Table  
(
    triple_id Int, 
    sub_id VarChar (10),  
    pre_id VarChar (10),  
    obj_id VarChar (10)
)

INSERT INTO @Triples  VALUES
(1, 34,65,23),
(2, 31,35,28),
(3, 32,32,19),
(4, 12,65,28),
(5, 76,32,34)

SELECT * 
FROM @Triples Triples
    INNER JOIN dbo.split (',', '65,32') as InputValues
        ON Triples.pre_id = InputValues.S

答案 2 :(得分:1)

您可以像这样使用子查询。

从triple中选择sub_id,其中pre_id为IN(从trile中选择pre_id,其中pre_id< = 65 AND pre_id => 32)

答案 3 :(得分:1)

你能做到的一种方法是使用表值函数 存在于MYSQL中(抱歉,但我不为其他人所知)

   CREATE FUNCTION [dbo].[fn_ado_test] (@ado nvarchar(4000), @Delim char(1)= ',')
   RETURNS @VALUES TABLE (ado nvarchar(4000),id int)AS
   BEGIN
   DECLARE @chrind INT 
   DECLARE @id int
   DECLARE @Piece nvarchar(4000)

   SELECT @chrind = 1,@id=0
   WHILE @chrind > 0
      BEGIN
         SELECT @chrind = CHARINDEX(@Delim,@ado),@id=@id+1
         IF @chrind > 0
            SELECT @Piece = LEFT(@ado,@chrind - 1)
         ELSE
            SELECT @Piece = @ado

         INSERT @VALUES(ado,id) VALUES(@Piece,@id)
         SELECT @ado = RIGHT(@ado,LEN(@ado) - @chrind)
         IF LEN(@ado) = 0 BREAK
      END
   RETURN
END

之后你使用这样的语句

/*--For First argument --*/
    select ado from [dbo].[fn_ado_test]('1,2,3',',') as parametar
    where parametar.id=1

/*-- Second --*/
select ado from [dbo].[fn_ado_test]('1,2,3',',') as parametar
        where parametar.id=2

答案 4 :(得分:0)

SELECT sub_id FROM triples WHERE pre_id IN (65, 32)

似乎对我有用。

注意:使用MySQL。