Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 细化双多对多联接_Sql_Many To Many_Inner Join - Fatal编程技术网

Sql 细化双多对多联接

Sql 细化双多对多联接,sql,many-to-many,inner-join,Sql,Many To Many,Inner Join,我有一个多对多账户用户关系。我正在尝试提取我和另一个用户共享的所有帐户。到目前为止,我已经从答案中修改了一些内容: 这似乎是正确的,但是account\u user表有一个“role”字段,我想确保我返回的记录包含其他用户的角色,而不是我的角色。我如何调整这一点以实现这一点?在我的示例中,“user2”是另一个用户,“user1”是您: -- query should work in most RDBMS SELECT A1.account, AU1.role AS user_2_

我有一个多对多账户用户关系。我正在尝试提取我和另一个用户共享的所有帐户。到目前为止,我已经从答案中修改了一些内容:


这似乎是正确的,但是
account\u user
表有一个“role”字段,我想确保我返回的记录包含其他用户的角色,而不是我的角色。我如何调整这一点以实现这一点?

在我的示例中,“user2”是另一个用户,“user1”是您:

-- query should work in most RDBMS
SELECT A1.account,
       AU1.role AS user_2_account_role,
       U1.uname AS user_2_name
FROM @account AS A1
JOIN @account_users AS AU1 ON AU1.account_id = A1.id
JOIN @user AS U1 ON U1.id = AU1.user_id
WHERE EXISTS(
    -- get accounts that are 'mine'
    SELECT *
    FROM @user AS U2
    JOIN @account_users AS AU2 ON AU2.user_id = U2.id
    WHERE U2.uname = 'user1' -- 'mine'
    AND AU2.account_id = AU1.account_id
)
AND U1.uname = 'user2' -- other user
我在SQL Server中准备的示例数据:

-- sample data in SQL SERVER
DECLARE @user TABLE(uname VARCHAR(20), id INT);
INSERT INTO @user(uname, id) 
VALUES('user1', 1),
      ('user2', 2),
      ('user3', 3),
      ('user4', 4);

DECLARE @account TABLE(account VARCHAR(20), id INT);
INSERT INTO @account(account, id)
VALUES('account1', 1),
      ('account2', 2),
      ('account3', 3),
      ('account4', 4);

DECLARE @account_users TABLE(account_id INT, user_id INT, role VARCHAR(10));
INSERT INTO @account_users(account_id, user_id, role)
VALUES(1, 1, 'user1_role'),
      (1, 2, 'user2_role'),
      (2, 1, 'user1_role'),
      (3, 3, 'user3_role'),
      (3, 4, 'user4_role');

这适用于我的Oracle,同样的基本思想也适用于任何DBMS:

SELECT account.*, role
FROM account
    JOIN account_user ON account_id = account.id AND user_id = :other_user_id
WHERE
    account.id IN (SELECT account_id FROM account_user WHERE user_id = :my_id)
用通俗易懂的英语:

  • 为其他用户加入
    account
    account\u user
  • 仅接受也连接到我的用户的帐户

如果需要,您可以轻松地加入
user
(如SQL所示,但不是您的问题所示)。

您可以重新表述该问题吗?结果集中是否有两个角色字段?如果是这样的话,你可以使用别名让你的选择来区分它们!所以很干净,而且很有效-喜欢它。(我必须在我的系统中指定
account.id
,而不仅仅是
id
,因为我得到了一个模糊错误…)
SELECT account.*, role
FROM account
    JOIN account_user ON account_id = account.id AND user_id = :other_user_id
WHERE
    account.id IN (SELECT account_id FROM account_user WHERE user_id = :my_id)