好吧,我认为必须有一种更简单的方法来做到这一点,我想动态地做,而不是手写每一行。我对MySQL比SQL Server 2008更熟悉,但我不确定如何在MySQL中这样做。
我有3张桌子。
Table 1: USER id | email | password
Table 2: METADATA id | name (list of fields I need to know about user)
Table 3: USER_META id | uid | name | value (where I store the user meta data)
我不对METADATA进行硬编码,因为它会针对此应用程序的每个实例进行更改。但是在这个例子中,我们只想说元数据是“眼睛”,“电话”,“城市”(实际上还有更多,本周可能有20个,下周可能有40个)
所以它的工作方式是当用户注册时,我使用METADATA表构建注册表单来构建表单。它创造了一个带有“眼睛”,“电话”和“城市”的形式。
当我保存表单时,我将每个数据项的单个记录保存到USER_META
表中。
因此,在注册时,我得到3个插入:
insert into USER_META(uid,name,value) values (5,"eyes","brown")
insert into USER_META(uid,name,value) values (5,"phone","555-1212")
insert into USER_META(uid,name,value) values (5,"city","San Francisco")
现在,我想编写一个存储过程,它将返回一个像这样的记录“
EXECUTE Get_Meta 5
返回:
uid | email | eyes | phone | city
5 x@x.com brown 555-1212 San Francisco;
我可以写一个很长的硬编码选择语句,如:
DECLARE @UID int;
SELECT id, email,
(select value from USER_META
where uid = @UID and name = 'EYES') as EYES,
(select value from USER_META
where uid = @UID and name = 'PHONE') as PHONE,
(select value from USER_META
where uid = @UID and name = 'CITY') as CITY,
FROM USER
where id = @UID;
但是这种方式违背了整个目的,每当元数据要求发生变化时(例如,当我们启动另一个实例时),我每周都要再写一次。
我想有这样的事情:(原谅我,我对高级SQL不是很有经验,所以也许这很容易,我只是不知道怎么做?)我会用基本的代码术语写它尝试解释我的想法:
DECLARE @UID int;
DECLARE @META_NAMES array;
@META_NAMES = (select NAME from METADATA);
SELECT id, email,
for each (@META_NAMES as $THIS_NAME) {
(select value from USER_META
where uid = @UID and name = '$THIS_NAME') as $THIS_NAME,
}
FROM USER
where id = @UID;
有没有办法在SQL Server 2008中编写它?
答案 0 :(得分:1)
您将在SQL Server中使用XML_PATH。 GROUP_CONCAT的解决方法
SELECT
U.UID,
U.EMAIL,
stuff(
(
select cast(',' as varchar(max)) + name + '=' + Value
from USER_META
WHERE UID = U.UID
for xml path('')
), 1, 1, '') AS M
FROM
USERS U