[英]sql self join on multiple attributes
我有一個(舊式)表,其中帶有列:
bug_num build_id closed_to
1 3 NULL
2 4 NULL
3 NULL 1
4 3 NULL
5 NULL 2
我想編寫一個查詢,從中選擇特定版本中的所有錯誤,以及該版本中與錯誤無關的所有錯誤。 因此,如果我想在構建3中執行此操作,它將包括#1和4(因為它們在構建3中)和3,因為它已對構建3(1)中的錯誤關閉。
我以為我很喜歡:
SELECT stat.bug_num,
stat.build_id
FROM bug_status stat
JOIN bug_status stat2
ON stat2.closed_to = stat.bug_num
WHERE stat.build_id = 3;
...但是似乎並沒有給我想要的結果。 謝謝你的幫助!
您沒有在WHERE子句中包含stat2.build_id
(我認為您的ON
列取自錯誤的表):
SELECT stat.bug_num, stat.build_id
FROM bug_status stat
LEFT JOIN bug_status stat2
ON stat.closed_to = stat2.bug_num
WHERE stat.build_id = 3 OR stat2.build_id = 3
SELECT stat.bug_num,
stat.build_id
FROM bug_status stat
WHERE stat.build_id = 3
OR stat.closed_to IN
( SELECT stat2.bug_num
FROM bug_status stat2
WHERE stat2.build_id = 3
)
;
(也可以使用JOIN或JOIN和UNION來執行此操作,但是我相信以上是最直觀的方法。)
編輯添加:這是一個MySQL成績單,展示了上述內容:
mysql> create table bug_status
-> (bug_num numeric, build_id numeric, closed_to numeric);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into bug_status values (1, 3, null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into bug_status values (2, 4, null);
Query OK, 1 row affected (0.01 sec)
mysql> insert into bug_status values (3, null, 1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into bug_status values (4, 3, null);
Query OK, 1 row affected (0.00 sec)
mysql> insert into bug_status values (5, null, 2);
Query OK, 1 row affected (0.00 sec)
mysql> SELECT stat.bug_num,
-> stat.build_id
-> FROM bug_status stat
-> WHERE stat.build_id = 3
-> OR stat.closed_to IN
-> ( SELECT stat2.bug_num
-> FROM bug_status stat2
-> WHERE stat2.build_id = 3
-> )
-> ;
+---------+----------+
| bug_num | build_id |
+---------+----------+
| 1 | 3 |
| 3 | NULL |
| 4 | 3 |
+---------+----------+
3 rows in set (0.00 sec)
編輯為add ,因為IN (...)
方法在OP的MySQL版本中似乎不起作用:這是一個提供相同結果的替代查詢:
SELECT stat.bug_num,
stat.build_id
FROM bug_status stat
LEFT
OUTER
JOIN bug_status stat2
ON stat.closed_to = stat2.bug_num
WHERE stat.build_id = 3
OR stat2.build_id = 3
;
為什么不:
DECLARE @build_id int = <the build id>
SELECT stat.bug_num, stat.build_id, stat.closed_to
FROM bug_status stat
WHERE stat.build_id = @build_id
OR stat.closed_to = @build_id
?
這個查詢...
SELECT *
FROM bug_status t1
WHERE
build_id = 3
OR EXISTS (
SELECT *
FROM bug_status t2
WHERE
t2.build_id = 3
AND t1.closed_to = t2.bug_num
)
...產生以下結果:
bug_num build_id closed_to
1 3 NULL
3 NULL 1
4 3 NULL
用簡單的英語:選擇以下行:
build_id = 3
build_id = 3
的相關行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.