where子句SQL中的多个表

时间:2018-04-04 13:55:58

标签: sql-server

我有两张桌子: -

Table_1

GetID UnitID
1     1,2,3
2     4,5
3     5,6
4     6

Table_2

ID UnitID UserID
1  1      1
1  2      1
1  3      1
1  4      1
1  5      2
1  6      3

我希望' GetID' 基于' UserID'

让我用一个例子来解释你。 对于例如

  1. 我想要UserID为1的所有GetID。 结果集应为1和2. 2包含,因为其中一个单位为2具有UserID 1.

  2. 我想要UserID为2的所有GetID 结果集应为2和3. 2,因为2个单位之一具有UserID 2。

  3. 我想实现这个目标。

    先谢谢你。

3 个答案:

答案 0 :(得分:1)

对此的查询会相对比较难看,因为您错误地将CSV数据存储在UnitID列中(或者可能是其他人做过的,而且您仍然坚持使用它。)

SELECT DISTINCT
    t1.GetID
FROM Table_1 t1
INNER JOIN Table_2 t2
    ON ',' + t1.UnitID + ',' LIKE '%,' + CONVERT(varchar(10), t2.UnitID) + ',%'
WHERE
    t2.UserID = 1;

Node tutorial on How To GraphQL

enter image description here

为了理解此处使用的连接技巧,对于Table_1的第一行,我们将,1,2,3,与来自UnitID的其他单Table_2值进行比较,例如%,1,%。希望很明显,我的逻辑将匹配CSV字符串中任意位置的单个UnitID值,包括第一个和最后一个。

但更好的长期方法是将这些CSV值分开到不同的记录中。然后,除了需要更简单的查询之外,您还可以利用像index这样的东西。

答案 1 :(得分:1)

您可以尝试这样的查询:

Demo

select 
distinct userid,getid 
from Table_1 t1 
join Table_2 t2
on t1.unitId+',' like '%' +cast(t2.unitid as varchar(max))+',%'
and t2.userid=1

答案 2 :(得分:0)

试试这个:

    declare @Table_1 table(GetID INT, UnitId VARCHAR(10))
    declare @Table_2 table(ID INT, UnitId INT,UserId INT)



    INSERT INTO @Table_1
    SELECT 1,'1,2,3'
    union
    SELECT 2,'4,5'
    union
    SELECT 3,'5,6'
    union
    SELECT 4,'6'


    INSERT INTO @Table_2
    SELECT 1,1,1
    union
    SELECT 1,2,1
    union
    SELECT 1,3,1
    union
    SELECT 1,4,1
    union
    SELECT 1,5,2
    union
    SELECT 1,6,3


    declare @UserId INT = 2
    DECLARE @UnitId VARCHAR(10)

    SELECT @UnitId=COALESCE(@UnitId + ',', '') + CAST(UnitId AS VARCHAR(5)) from @Table_2 WHERE UserId=@UserId


    select distinct t.GetId
    from @Table_1 t
    CROSS APPLY [dbo].[Split](UnitId,',') AS AA
    CROSS APPLY [dbo].[Split](@UnitId,',') AS BB
    WHERE AA.Value=BB.Value

分割功能:

    CREATE FUNCTION [dbo].Split(@input AS Varchar(4000) )

    RETURNS

          @Result TABLE(Value BIGINT)

    AS

    BEGIN

          DECLARE @str VARCHAR(20)

          DECLARE @ind Int

          IF(@input is not null)

          BEGIN

                SET @ind = CharIndex(',',@input)

                WHILE @ind > 0

                BEGIN

                      SET @str = SUBSTRING(@input,1,@ind-1)

                      SET @input = SUBSTRING(@input,@ind+1,LEN(@input)-@ind)

                      INSERT INTO @Result values (@str)

                      SET @ind = CharIndex(',',@input)

                END

                SET @str = @input

                INSERT INTO @Result values (@str)

          END

          RETURN

    END