我有两张桌子: -
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' 。
让我用一个例子来解释你。 对于例如
我想要UserID为1的所有GetID。 结果集应为1和2. 2包含,因为其中一个单位为2具有UserID 1.
我想要UserID为2的所有GetID 结果集应为2和3. 2,因为2个单位之一具有UserID 2。
我想实现这个目标。
先谢谢你。
答案 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
为了理解此处使用的连接技巧,对于Table_1
的第一行,我们将,1,2,3,
与来自UnitID
的其他单Table_2
值进行比较,例如%,1,%
。希望很明显,我的逻辑将匹配CSV字符串中任意位置的单个UnitID
值,包括第一个和最后一个。
但更好的长期方法是将这些CSV值分开到不同的记录中。然后,除了需要更简单的查询之外,您还可以利用像index这样的东西。
答案 1 :(得分:1)
您可以尝试这样的查询:
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