我有table
连接到另一个表
所有者可以是参与者,如果是,则所有者和参与者中有相同的引用(进入用户表)。所以我做了:
SELECT TableA.Id,TableA.Owner,TableA.Text FROM TableA WHERE TableA.Owner=@User UNION SELECT TableA.Id,TableA.Owner.TableA.Text FROM TableA LEFT JOIN TableB ON (TableA.Id=TableB.Id) WHERE TableB.Participant = @User
此查询应返回所有不同的数据集,其中某个@User是所有者或参与者或两者都存在。
而且,如果SQL Server不会抛出
数据类型文本不能用作UNION,INTERSECT或EXCEPT运算符的操作数,因为它不可比较。
由于Id是PK,而Text是来自同一表,因此SQL Server为什么要完全比较Text?
我可以使用它UNION ALL来停止重复检测,但是我可以在不失去结果唯一性的情况下绕过它吗?
UNION ALL
正确的方法
停止使用TEXT它已过时。更改表架构。
TEXT
*在将来的Microsoft SQL Server版本中,将删除 *ntext,text和image 数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。 请改用nvarchar(max),varchar(max)和varbinary(max)。
解决方法
投放至NVARCHAR(MAX):
NVARCHAR(MAX)
SELECT TableA.Id,TableA.Owner, CAST(TableA.DescriptionText AS NVARCHAR(MAX)) FROM TableA WHERE TableA.Owner=@User UNION SELECT TableA.Id,TableA.Owner, CAST(TableA.DescriptionText AS NVARCHAR(MAX)) FROM TableA LEFT JOIN TableB ON (TableA.Id=TableB.Id) WHERE TableB.Participant = @User