SQLite query - filter name where each associated id is contained within a set of ids
I'm trying to work out a query that will find me all of the distinct Names
whose LocationIDs
are in a given set of ids. The catch is if any of the LocationIDs
associated with a distinct Name
are not in the set, then the Name
should not be in the results.
Say I have the following table:
ID | LocationID | ... | Name
-----------------------------
1 | 1 | ... | A
2 | 1 | ... | B
3 | 2 | ... | B
I'm needing a query similar to
SELECT DISTINCT Name FROM table WHERE LocationID IN (1, 2);
The problem with the above is it's just checking if the LocationID
is 1 OR 2, this would return the following:
A
B
But what I need it to return is
B
Since B is the only Name
where both of its LocationIDs
are in the set (1, 2)
sql sqlite select
add a comment |
I'm trying to work out a query that will find me all of the distinct Names
whose LocationIDs
are in a given set of ids. The catch is if any of the LocationIDs
associated with a distinct Name
are not in the set, then the Name
should not be in the results.
Say I have the following table:
ID | LocationID | ... | Name
-----------------------------
1 | 1 | ... | A
2 | 1 | ... | B
3 | 2 | ... | B
I'm needing a query similar to
SELECT DISTINCT Name FROM table WHERE LocationID IN (1, 2);
The problem with the above is it's just checking if the LocationID
is 1 OR 2, this would return the following:
A
B
But what I need it to return is
B
Since B is the only Name
where both of its LocationIDs
are in the set (1, 2)
sql sqlite select
add a comment |
I'm trying to work out a query that will find me all of the distinct Names
whose LocationIDs
are in a given set of ids. The catch is if any of the LocationIDs
associated with a distinct Name
are not in the set, then the Name
should not be in the results.
Say I have the following table:
ID | LocationID | ... | Name
-----------------------------
1 | 1 | ... | A
2 | 1 | ... | B
3 | 2 | ... | B
I'm needing a query similar to
SELECT DISTINCT Name FROM table WHERE LocationID IN (1, 2);
The problem with the above is it's just checking if the LocationID
is 1 OR 2, this would return the following:
A
B
But what I need it to return is
B
Since B is the only Name
where both of its LocationIDs
are in the set (1, 2)
sql sqlite select
I'm trying to work out a query that will find me all of the distinct Names
whose LocationIDs
are in a given set of ids. The catch is if any of the LocationIDs
associated with a distinct Name
are not in the set, then the Name
should not be in the results.
Say I have the following table:
ID | LocationID | ... | Name
-----------------------------
1 | 1 | ... | A
2 | 1 | ... | B
3 | 2 | ... | B
I'm needing a query similar to
SELECT DISTINCT Name FROM table WHERE LocationID IN (1, 2);
The problem with the above is it's just checking if the LocationID
is 1 OR 2, this would return the following:
A
B
But what I need it to return is
B
Since B is the only Name
where both of its LocationIDs
are in the set (1, 2)
sql sqlite select
sql sqlite select
asked Nov 14 '18 at 0:41
Programmer001Programmer001
530623
530623
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
You can try to write two subquery.
- get
count
by eachName
- get
count
by your condition.
then join
them by count amount, which means your need to all match your condition count number.
Schema (SQLite v3.17)
CREATE TABLE T(
ID int,
LocationID int,
Name varchar(5)
);
INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');
Query #1
SELECT t2.Name
FROM
(
SELECT COUNT(DISTINCT LocationID) cnt
FROM T
WHERE LocationID IN (1, 2)
) t1
JOIN
(
SELECT COUNT(DISTINCT LocationID) cnt,Name
FROM T
WHERE LocationID IN (1, 2)
GROUP BY Name
) t2 on t1.cnt = t2.cnt;
| Name |
| ---- |
| B |
View on DB Fiddle
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
1
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
1
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
add a comment |
You can just use aggregation. Assuming no duplicates in your table:
SELECT Name
FROM table
WHERE LocationID IN (1, 2)
GROUP BY Name
HAVING COUNT(*) = 2;
If Name
/LocationID
pairs can be duplicated, use HAVING COUNT(DISTINCT LocationID) = 2
.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291543%2fsqlite-query-filter-name-where-each-associated-id-is-contained-within-a-set-of%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can try to write two subquery.
- get
count
by eachName
- get
count
by your condition.
then join
them by count amount, which means your need to all match your condition count number.
Schema (SQLite v3.17)
CREATE TABLE T(
ID int,
LocationID int,
Name varchar(5)
);
INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');
Query #1
SELECT t2.Name
FROM
(
SELECT COUNT(DISTINCT LocationID) cnt
FROM T
WHERE LocationID IN (1, 2)
) t1
JOIN
(
SELECT COUNT(DISTINCT LocationID) cnt,Name
FROM T
WHERE LocationID IN (1, 2)
GROUP BY Name
) t2 on t1.cnt = t2.cnt;
| Name |
| ---- |
| B |
View on DB Fiddle
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
1
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
1
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
add a comment |
You can try to write two subquery.
- get
count
by eachName
- get
count
by your condition.
then join
them by count amount, which means your need to all match your condition count number.
Schema (SQLite v3.17)
CREATE TABLE T(
ID int,
LocationID int,
Name varchar(5)
);
INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');
Query #1
SELECT t2.Name
FROM
(
SELECT COUNT(DISTINCT LocationID) cnt
FROM T
WHERE LocationID IN (1, 2)
) t1
JOIN
(
SELECT COUNT(DISTINCT LocationID) cnt,Name
FROM T
WHERE LocationID IN (1, 2)
GROUP BY Name
) t2 on t1.cnt = t2.cnt;
| Name |
| ---- |
| B |
View on DB Fiddle
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
1
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
1
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
add a comment |
You can try to write two subquery.
- get
count
by eachName
- get
count
by your condition.
then join
them by count amount, which means your need to all match your condition count number.
Schema (SQLite v3.17)
CREATE TABLE T(
ID int,
LocationID int,
Name varchar(5)
);
INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');
Query #1
SELECT t2.Name
FROM
(
SELECT COUNT(DISTINCT LocationID) cnt
FROM T
WHERE LocationID IN (1, 2)
) t1
JOIN
(
SELECT COUNT(DISTINCT LocationID) cnt,Name
FROM T
WHERE LocationID IN (1, 2)
GROUP BY Name
) t2 on t1.cnt = t2.cnt;
| Name |
| ---- |
| B |
View on DB Fiddle
You can try to write two subquery.
- get
count
by eachName
- get
count
by your condition.
then join
them by count amount, which means your need to all match your condition count number.
Schema (SQLite v3.17)
CREATE TABLE T(
ID int,
LocationID int,
Name varchar(5)
);
INSERT INTO T VALUES (1, 1,'A');
INSERT INTO T VALUES (2, 1,'B');
INSERT INTO T VALUES (3, 2,'B');
Query #1
SELECT t2.Name
FROM
(
SELECT COUNT(DISTINCT LocationID) cnt
FROM T
WHERE LocationID IN (1, 2)
) t1
JOIN
(
SELECT COUNT(DISTINCT LocationID) cnt,Name
FROM T
WHERE LocationID IN (1, 2)
GROUP BY Name
) t2 on t1.cnt = t2.cnt;
| Name |
| ---- |
| B |
View on DB Fiddle
edited Nov 14 '18 at 1:56
answered Nov 14 '18 at 0:44
D-ShihD-Shih
25.7k61531
25.7k61531
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
1
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
1
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
add a comment |
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
1
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
1
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
@Programmer001 Is that work for you?
– D-Shih
Nov 14 '18 at 1:29
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
Hey, I was just trying it out. It doesn't look like it works for other data sets. Trying it out with actual data returned the wrong results. I added more variety to the data in the fiddle and it returned a name that wasn't in the ID set. I updated the fiddle with a different data set: db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/2 I think we're on the right track for a correct solution but I think comparing by count this way is throwing it off.
– Programmer001
Nov 14 '18 at 1:46
1
1
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
@Programmer001 Ok I see did you want to get emty result from your sample data in the sqlfiddle db-fiddle.com/f/sswND35ZvSb482v7dNQTi5/3?
– D-Shih
Nov 14 '18 at 1:56
1
1
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
My bad, I added INSERT INTO T VALUES (8, 4, 'A1'); to the schema. This appears to be working. I'm going to keep playing around with it, if nothing pops up then later tomorrow I'll mark this as the accepted answer. Thanks!
– Programmer001
Nov 14 '18 at 2:13
add a comment |
You can just use aggregation. Assuming no duplicates in your table:
SELECT Name
FROM table
WHERE LocationID IN (1, 2)
GROUP BY Name
HAVING COUNT(*) = 2;
If Name
/LocationID
pairs can be duplicated, use HAVING COUNT(DISTINCT LocationID) = 2
.
add a comment |
You can just use aggregation. Assuming no duplicates in your table:
SELECT Name
FROM table
WHERE LocationID IN (1, 2)
GROUP BY Name
HAVING COUNT(*) = 2;
If Name
/LocationID
pairs can be duplicated, use HAVING COUNT(DISTINCT LocationID) = 2
.
add a comment |
You can just use aggregation. Assuming no duplicates in your table:
SELECT Name
FROM table
WHERE LocationID IN (1, 2)
GROUP BY Name
HAVING COUNT(*) = 2;
If Name
/LocationID
pairs can be duplicated, use HAVING COUNT(DISTINCT LocationID) = 2
.
You can just use aggregation. Assuming no duplicates in your table:
SELECT Name
FROM table
WHERE LocationID IN (1, 2)
GROUP BY Name
HAVING COUNT(*) = 2;
If Name
/LocationID
pairs can be duplicated, use HAVING COUNT(DISTINCT LocationID) = 2
.
answered Nov 14 '18 at 4:01
Gordon LinoffGordon Linoff
766k35297401
766k35297401
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291543%2fsqlite-query-filter-name-where-each-associated-id-is-contained-within-a-set-of%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown