我有两个表,TABLE1有两列(EID和NAME),TABLE2有两列(CID和E_LIST)。现在,我想从TABLE1中选择数据,其中EID来自TABLE2的E_LIST,但似乎它不起作用。
EID NAME
E01 GREEN
E02 BROWN
E03 BLACK
E04 APPLE
E05 FOOD
E06 FISH
CID E_LIST
C01 E02,E05,E06
C02 E01,E02,E03
SELECT * FROM TABLE1 WHERE EID IN (SELECT E_LIST FROM TABLE2 WHERE CID ='C01')
你能告诉我这里的错误并给我解决方案。谢谢。
答案 0 :(得分:2)
停止在单列中存储逗号分隔值。为每个CID
和E_LIST
组合设置单独的行。数据检索将更容易
现在回到这个问题,你需要一个分裂字符串函数来做这个
SELECT *
FROM TABLE1
WHERE EID IN (SELECT cs.split_items
FROM TABLE2 t2
CROSS apply Udf_splitstring(t2.E_LIST, ',') cs
WHERE t2.CID = 'C01')
从这里Split strings the right way – or the next best way创建一个。
我更喜欢计数表方法
CREATE FUNCTION dbo.Udf_splitstring
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING AS
RETURN
WITH cteTally(N) AS
(
SELECT TOP (DATALENGTH(ISNULL(@List,1))+1) Number-1
FROM dbo.Numbers ORDER BY Number
),
cteStart(N1) AS
(
SELECT t.N+1
FROM cteTally t
WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0)
)
SELECT split_items = SUBSTRING(@List, s.N1,
ISNULL(NULLIF(CHARINDEX(@Delimiter, @List, s.N1), 0) - s.N1, 8000))
FROM cteStart AS s;
答案 1 :(得分:1)
在链接中使用LoginActivity.java之类的内容。还有其他更好的功能。
NullPointerException
答案 2 :(得分:0)
查询将EID与EID列表进行比较。您可以通过连接而不是子查询来解决问题,并使用like
假设一个EID不能是另一个EID的子字符串。
答案 3 :(得分:0)
使用左连接查询。这对你来说很容易